C#結(jié)構(gòu)學(xué)習(xí)的詳細介紹
C#結(jié)構(gòu)1.C#結(jié)構(gòu)的聲明
·結(jié)構(gòu)是用戶自定義的值類型
- struct Pair
- {
- public int X, Y;
- //公有變量名單詞的首字母大寫(PascalCase規(guī)則)
- }
- struct Pair
- {
- private int x, y;
- //非公有變量名第一個單詞的首字母小寫(camelCase規(guī)則)
- }
- struct Pair
- {
- int x, y; //缺省的訪問修飾符是private
- };//可以有結(jié)尾分號
C#結(jié)構(gòu)是C#程序員用來定義自己的值類型的最普遍的機制。結(jié)構(gòu)比枚舉更強大,因為它提供函數(shù)、字段、構(gòu)造函數(shù)、操作符和訪問控制。結(jié)構(gòu)成員的缺省訪問權(quán)限是private(在C++中是public)。當你定義結(jié)構(gòu)的成員名時,不要忘了對公有成員使用PascalCase規(guī)則,而對非公有成員使用camelCase規(guī)則。
結(jié)構(gòu)類的聲明中雖然可以使用結(jié)尾分號,但建議你不要使用,這只不過是為了照顧C++程序員的習(xí)慣。
C#結(jié)構(gòu)2.值的產(chǎn)生
·一個結(jié)構(gòu)類的變量存在于棧(stack)中
◆字段不是被預(yù)先賦值的
◆字段只有被賦值后才能讀
◆使用點操作符來訪問成員
下面的例子假設(shè)Pair是一結(jié)構(gòu),它有兩公有整數(shù)類成員X,Y
- static void Main()
- {
- Pair p;
- Console.Write(p.X); //錯誤
- ...
- }
- static void Main()
- {
- Pair p;
- p.X = 0;
- Console.Write(p.X); //正確
- ...
- }
C#結(jié)構(gòu)類的變量存在于棧中。在上面的例子中,雖然聲明了一個叫p的Pair類結(jié)構(gòu)變量,但實際上只是聲明兩個局部變量p.X和p.Y的一種簡寫形式。
上面例子中的第一段程序的Console.Write試圖使用p.X的值,但它是錯誤的,因為p.X沒有被賦初值。
C#結(jié)構(gòu)3.值的初始化
·一個結(jié)構(gòu)變量:
◆總是能使用缺省構(gòu)造函數(shù)來進行初始化
◆缺省構(gòu)造函數(shù)把字段初始化為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
- ...
- }
除了上面介紹的初始化方法外,還可以使用缺省構(gòu)造函數(shù)來初始化一個結(jié)構(gòu)變量。調(diào)用構(gòu)造函數(shù)總是使用new關(guān)鍵字。一個結(jié)構(gòu)變量是值類型的,它直接存在于棧中,new關(guān)鍵字的使用不會在堆中開辟內(nèi)存。結(jié)構(gòu)的缺省構(gòu)造函數(shù)總是把結(jié)構(gòu)變量中的所有字段初始化(你不能改變這一行為,在下面一節(jié)會講到)。
C#結(jié)構(gòu)學(xué)習(xí)遇到的問題:如果你有C++或Java背景,你可能會很難相信使用new關(guān)鍵字來調(diào)用構(gòu)造函數(shù)不會在堆中分配內(nèi)存,但在C#中就是這樣。結(jié)構(gòu)變量存在于棧中,調(diào)用構(gòu)造函數(shù)初始化它的字段,沒有發(fā)生堆的內(nèi)存分配。
C++程序員注意:在C#中調(diào)用缺省構(gòu)造函數(shù)必須使用括號。
- Pair p = new Pair; //錯誤
- Pair p = new Pair();//正確
C#結(jié)構(gòu)4.值的構(gòu)造函數(shù)
·一般規(guī)則
◆編譯器聲明缺省構(gòu)造函數(shù)
◆你不能聲明缺省構(gòu)造函數(shù)
◆缺省構(gòu)造函數(shù)把所有的實例字段初始化為0/false/null
- struct Pair
- {
- }
- //編譯器聲明一缺省構(gòu)造函數(shù)
- struct Pair
- {
- public Pair()
- { ... }
- }
- //錯誤,不能自己聲明缺省構(gòu)造函數(shù)
- struct Pair
- {
- public Pair(int x, int y)
- { ... }
- }
- //正確,但編譯器聲明的缺省構(gòu)造函數(shù)仍存在
C#結(jié)構(gòu)類總有一編譯器聲明的公有的缺省構(gòu)造函數(shù)。不管你有沒有聲明構(gòu)造函數(shù),編譯器聲明的公有的缺省構(gòu)造函數(shù)總是存在的。所以你不能定義缺省構(gòu)造函數(shù),這樣會出現(xiàn)兩個缺省構(gòu)造函數(shù),這是不允許的。但要注意的是,這只適合于結(jié)構(gòu),對于類是不適用的。編譯器產(chǎn)生的缺省構(gòu)造函數(shù)把所有的實例字段歸零化:
◆bool型化為false
◆整型(包括字符型)化為0
◆實型化為0.0
◆枚舉型化為0
◆引用型(包括字符串)化為null
用戶自定義的結(jié)構(gòu)類的構(gòu)造函數(shù)的默認訪問權(quán)限是private,和結(jié)構(gòu)類的字段一樣。
C#不允許你聲明一個和構(gòu)造函數(shù)名字一樣的函數(shù)。
C#結(jié)構(gòu)5.:this(…)
·一個構(gòu)造函數(shù)可以調(diào)用另一構(gòu)造函數(shù)
- 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;
- }
C#結(jié)構(gòu)的相關(guān)內(nèi)容就向你介紹到這里,希望對你學(xué)習(xí)了解C#結(jié)構(gòu)有所幫助。
【編輯推薦】