2008-10-03 83 views
160

我已經習慣了寫作課是這樣的:初始化C#自動性能

public class foo { 
    private string mBar = "bar"; 
    public string Bar { 
    get { return mBar; } 
    set { mBar = value; } 
    } 
    //... other methods, no constructor ... 
} 

轉換杆到自動屬性看起來很方便,簡潔,但我怎麼能留住初始化不添加一個構造函數,並把那裏的初始化?

public class foo2theRevengeOfFoo { 
    //private string mBar = "bar"; 
    public string Bar { get; set; } 
    //... other methods, no constructor ... 
    //behavior has changed. 
} 

你可以看到,添加一個構造函數不與努力的儲蓄,我應該從汽車的屬性得到內聯。

像這樣的事情會讓我更有意義:

public string Bar { get; set; } = "bar"; 
+1

是否有一個特別的原因,你不想在構造函數中完成它,因爲它似乎是我自然的地方。 – 2008-10-03 23:01:55

+13

僅僅因爲我之前不需要在構造函數中完成它。因此,如果我不得不添加一個構造函數,它不會節省我的任何努力。 – dlamblin 2008-10-03 23:04:59

+5

如果它是靜態私人字符串...?然後你不想在構造函數中進行初始化,因爲每次創建新對象時都會調用它,這不是特別想要的。 ~~~ – 2011-11-23 12:05:13

回答

173

更新 - 下面的答案是在C#6出現之前編寫的。在C#6你可以寫:

public class Foo 
{ 
    public string Bar { get; set; } = "bar"; 
} 

您可以寫入只讀自動實現的屬性,它們只在構造函數中寫入(但也可以給出一個默認的初始值:

public class Foo 
{ 
    public string Bar { get; } 

    public Foo(string bar) 
    { 
     Bar = bar; 
    } 
} 

這是不幸的,沒有現在這樣做的方式。你必須設置在構造函數的值。(使用構造函數鏈可以幫助避免重複。)

自動實現的屬性現在很方便,但肯定會更好。我不覺得自己需要這種初始化,就像只能在構造函數中設置的只讀自動實現的屬性一樣,並且只能通過只讀字段來支持。

直到幷包括C#5,但正在爲C#6計劃 - 在允許在聲明點初始化時,允許只讀自動實現的屬性被初始化在構造函數體中。

3

在默認的構造函數(和任何非默認的,如果你有太多的任何課程):

public foo() { 
    Bar = "bar"; 
} 

這是無論如何,我相信您的原始代碼的性能不會遜色,因爲這是幕後發生的事情。

public class foo { 
    public foo(){ 
    Bar = "bar"; 
    } 
    public string Bar {get;set;} 
} 

如果你有另一個構造函數(即,一種採用paramters)或一串構造函數,你總是可以有這個(稱爲構造函數:

34

你可以通過你的類的構造函數做鏈接):

public class foo { 
    private foo(){ 
    Bar = "bar"; 
    Baz = "baz"; 
    } 
    public foo(int something) : this(){ 
    //do specialized initialization here 
    Baz = string.Format("{0}Baz", something); 
    } 
    public string Bar {get; set;} 
    public string Baz {get; set;} 
} 

如果你總是連鎖默認的構造函數的調用,你可以擁有所有默認屬性初始化設置在那裏。鏈接時,鏈接的構造函數將在調用構造函數之前調用,以便更專業的構造函數可以根據需要設置不同的默認值。

22

它將在C#6中成爲可能。0:

public int Y { get; } = 2;