關(guān)于C#3.0新特性之對(duì)象構(gòu)造者

字號(hào):

C#3.0中加入的對(duì)象構(gòu)造者特性,使得對(duì)象的初始化工作變得格外簡(jiǎn)單,我們可以采用類(lèi)似于數(shù)組初始化的方式來(lái)初始化類(lèi)的對(duì)象,方法就是直接在創(chuàng)建類(lèi)對(duì)象的表達(dá)式后面跟上類(lèi)成員的初始化代碼。
    以前我們?cè)诼暶鲾?shù)組時(shí),可以同時(shí)對(duì)其進(jìn)行初始化,這樣就省去了很多麻煩,但是在創(chuàng)建類(lèi)的對(duì)象時(shí),這招可就不靈了,我們要么調(diào)用該類(lèi)的構(gòu)造函數(shù)完成對(duì)象的初始化,要么就手工進(jìn)行初始化。這兩種方法都不太方便,使用構(gòu)造函數(shù)來(lái)對(duì)對(duì)象進(jìn)行初始化時(shí),我們?yōu)榱四撤N靈活性,可能需要編寫(xiě)構(gòu)造函數(shù)的多個(gè)重載版本,實(shí)在是麻煩。
    具體示例如下:
    以下是引用片段:
     class Point
     {
     public int X { get; set; }
     public int Y { get; set; }
     public override string ToString()
     {
     return "(" + X.ToString() + ", " + Y.ToString() + ")";
     }
     }
     class Rectangle
     {
     public Point P1 { get; set; }
     public Point P2 { get; set; }
     public Rectangle()
     {
     P1 = new Point();
     P2 = new Point();
     }
     public override string ToString()
     {
     return "P1: " + P1 + ", P2: " + P2;
     }
     }
     class ObjectBuilder : AppRunner.AbstractApplication
     {
     public override void Run()
     {
     Point thePoint = new Point() { X = 1, Y = 2 };
     Console.WriteLine("Point(X, Y) = {0}", thePoint);
     Rectangle theRectangle = new Rectangle() {
     P1 = { X = 1, Y = 1 }, P2 = { X = 100, Y = 200 }
     };
     Console.WriteLine(theRectangle);
     }
     }
    我們?cè)诙xPoint類(lèi)的X和Y屬性時(shí),只須寫(xiě)上該屬性的get和set訪(fǎng)問(wèn)器聲明,C#編譯器會(huì)自動(dòng)為我們生成默認(rèn)的get和set操作代碼,當(dāng)我們需要定義簡(jiǎn)單屬性時(shí),這個(gè)特性非常有用。
    我們以new Point() { X = 1, Y = 2 }語(yǔ)句,輕松的完成了對(duì)Point類(lèi)的初始化工作。在創(chuàng)建類(lèi)的對(duì)象時(shí),我們可以按照需要去初始化類(lèi)的對(duì)象,只要在類(lèi)的創(chuàng)建表達(dá)式后跟上要初始化屬性的列表即可,且可以只對(duì)需要初始化的屬性賦初值,而無(wú)需把所有屬性的初始值都寫(xiě)上去。
    在theRectangle對(duì)象的初始化表達(dá)式中,我們首先對(duì)P1屬性進(jìn)行初始化,然而P1屬性也是一個(gè)自定義的類(lèi)型,所以P1屬性的初始化是另一個(gè)類(lèi)型(Point)的初始化表達(dá)式,我們可以這樣的方式來(lái)對(duì)更加復(fù)雜的類(lèi)型進(jìn)行初始化。