一週學會C#(結構一)

一週學會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); //正確

    ...

}

結構類的變量存在於棧中。在上面的例子中,雖然聲明瞭一個叫pPair類結構變量,但實際上只是聲明兩個局部變量p.Xp.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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章