結構類值的產生
• 一個結構類的變量存在於棧(stack)中
字段不是被預先賦值的
字段只有被賦值後才能讀
使用點操作符來訪問成員
下面的例子假設Pair是一結構,它有兩公有整數類成員X,Y
static void Main()
{
Pair p;
Console.Write(p.X); //錯誤
...
}
static void Main()
{
Pair p;
p.X = 0;
Console.Write(p.X); //正確
...
}
結構類的變量存在於棧中。在上面的例子中,雖然聲明了一個叫p的Pair類結構變量,但實際上只是聲明兩個局部變量p.X和p.Y的一種簡寫形式。
上面例子中的第一段程序的Console.Write試圖使用p.X的值,但它是錯誤的,因為p.X沒有被賦初值。
結構類值的初始化
• 一個結構變量:
總是能使用缺省構造函數來進行初始化
缺省構造函數把字段初始化為0/false/null
static void Main()
{
Pair p;
Console.Write(p.X); //錯誤,p.X沒有初始化
...
}
static void Main()
{
Pair p = new Pair();
Console.Write(p.X); //正確,p.X=0
...
}
除了上面介紹的初始化方法外,還可以使用缺省構造函數來初始化一個結構變量。調用構造函數總是使用new關鍵字。一個結構變量是值類型的,它直接存在於棧中,new關鍵字的使用不會在堆中開辟內存。結構的缺省構造函數總是把結構變量中的所有字段初始化(你不能改變這一行為,在下面一節會講到)。
如果你有C++或Java背景,你可能會很難相信使用new關鍵字來調用構造函數不會在堆中分配內存,但在C#中就是這樣。結構變量存在於棧中,調用構造函數初始化它的字段,沒有發生堆的內存分配。
C++程序員注意:在C#中調用缺省構造函數必須使用括號。
Pair p = new Pair; //錯誤
Pair p = new Pair();//正確