結構不能宣告無參數建構函式,編譯器會自動提供一個將所有欄位初始化為預設值(0、null、false)的建構函式。開發者只能定義帶參數的建構函式,且必須在建構函式中明確初始化所有實例欄位。
public struct Book
{
public int BookId;
public string BookName;
public string BookAuthor;
public double BookPrice;
// 必須初始化所有欄位
public Book(int id, string name, string author, double price)
{
BookId = id;
BookName = name;
BookAuthor = author;
BookPrice = price;
}
}
// 呼叫自訂建構函式
var book1 = new Book(1, "C# 深度解析", "張三", 599.0);
// 呼叫預設建構函式(所有欄位為預設值)
var book2 = new Book();
Console.WriteLine(book2.BookName); // null
Console.WriteLine(book2.BookPrice); // 0
結構允許在未呼叫建構函式的情況下逐欄位賦值,但必須在使用前完成所有欄位初始化,否則編譯錯誤。
Book book3;
book3.BookId = 2;
book3.BookName = "ASP.NET Core 實戰";
book3.BookAuthor = "李四";
book3.BookPrice = 499.0; // 此後才能使用 book3
Console.WriteLine(book3.BookName);
new Book() 呼叫預設建構函式。public int X = 5; 會編譯失敗)。finalize/解構函式。readonly、屬性唯讀),避免可變實值型別的陷阱。