一週學會C#(結構一)
C#才鳥(QQ:249178521)
1.結構的聲明<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
· 結構是用戶自定義的值類型
struct Pair
{
public int X, Y; //公有變量名單詞的首字母大寫(PascalCase規則)
}
struct Pair
{
private int x, y; //非公有變量名第一個單詞的首字母小寫(camelCase規則)
}
struct Pair
{
int x, y; //缺省的訪問修飾符是private
};//可以有結尾分號
結構是C#程序員用來定義自己的值類型的最普遍的機制。結構比枚舉更強大,因爲它提供函數、字段、構造函數、操作符和訪問控制。結構成員的缺省訪問權限是private(在C++中是public)。當你定義結構的成員名時,不要忘了對公有成員使用PascalCase規則,而對非公有成員使用camelCase規則。
結構類的聲明中雖然可以使用結尾分號,但建議你不要使用,這只不過是爲了照顧C++程序員的習慣。
2.值的產生
· 一個結構類的變量存在於棧(stack)中
w 字段不是被預先賦值的
w 字段只有被賦值後才能讀
w 使用點操作符來訪問成員
下面的例子假設Pair是一結構,它有兩公有整數類成員X,Y
static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />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沒有被賦初值。
3.值的初始化
· 一個結構變量:
w 總是能使用缺省構造函數來進行初始化
w 缺省構造函數把字段初始化爲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();//正確
4.值的構造函數
· 一般規則
w 編譯器聲明缺省構造函數
w 你不能聲明缺省構造函數
w 缺省構造函數把所有的實例字段初始化爲0/false/null
struct Pair
{
}
//編譯器聲明一缺省構造函數
struct Pair
{
public Pair()
{ ... }
}
//錯誤,不能自己聲明缺省構造函數
struct Pair
{
public Pair(int x, int y)
{ ... }
}
//正確,但編譯器聲明的缺省構造函數仍存在
結構類總有一編譯器聲明的公有的缺省構造函數。不管你有沒有聲明構造函數,編譯器聲明的公有的缺省構造函數總是存在的。所以你不能定義缺省構造函數,這樣會出現兩個缺省構造函數,這是不允許的。但要注意的是,這隻適合於結構,對於類是不適用的。編譯器產生的缺省構造函數把所有的實例字段歸零化:
l bool型化爲false
l 整型(包括字符型)化爲0
l 實型化爲0.0
l 枚舉型化爲0
l 引用型(包括字符串)化爲null
用戶自定義的結構類的構造函數的默認訪問權限是private,和結構類的字段一樣。
C#不允許你聲明一個和構造函數名字一樣的函數。
5.:this(…)
· 一個構造函數可以調用另一構造函數
struct ColouredPoint
{
public ColouredPoint(int x, int y)
: this(x, y, Colour.Red)
{
}
public ColouredPoint(int x, int y, Colour c)
{
...
}
...
private int x, y;
private Colour c;
}