2011-06-09 277 views
4

可能重複:
C# member variable initialization; best practice?C#:初始化類變量

這是初始化類變量的正確方法。 [1]和[2]之間的區別是什麼?

//[1] 
public class Person 
{ 
    private int mPersonID = 0; 
    private string mPersonName = ""; 
} 

OR

//[2] 
public class Person 
{ 
    private int mPersonID = 0; 
    private string mPersonName = ""; 

    public Person() 
    { 
     InitializePerson(); 
    } 

    private void InitializePerson() 
    { 
      mPersonID = 0; 
      mPersonName = ""; 
    } 
} 
+0

還有類似的問題在這裏:http://stackoverflow.com/questions/298183/c-member-variable-initialization-best-practice – RandomWebGuy 2011-06-09 03:21:23

回答

5

實例變量從外面看,1)和2)之間沒有明顯的行爲差異,這主要是風格問題。

你也在你的方法中引入了一個額外的InitializePerson()方法2) - 如果你有多個構造函數,那麼所有可以使用相同的通用初始化方法(這會使代碼保持乾燥)。

編輯迴應評論,看到MSDN

字段是構造函數 實例被稱爲對象之前立即 初始化。如果構造函數 指定了一個字段的值,它將會覆蓋 聲明期間給出的任何值 。

+0

如何在構造函數之前分配字段? – 2011-06-09 03:25:06

+0

@Alex:這就是它的工作原理,你也可以查看http://msdn.microsoft.com/en-us/library/ms173118%28v=vs.80%29.aspx以獲得參考 – BrokenGlass 2011-06-09 03:27:06

+0

我希望寫這篇文章的人這解釋瞭如何在構造函數之前調用代碼。看看我的答案,代碼肯定在構造函數內部。 – 2011-06-09 03:31:09

2

在這兩種情況下,將產生IL會看起來幾乎是相同的。說'差不多',因爲你在第二種方法中引入了額外的方法。如果你只是把它放到構造函數中,而不是相同的IL代碼。

所以最好使用方法#1,因爲它代碼少。

此外,您不需要指定默認值(0代表int,null代表參考類型)。

這兩個例子產生相同的IL:

public class Test 
{ 
    private string test1 = ""; 
} 

public class Test 
{ 
    private string test1; 

    public public Test() 
    { 
     test1 = ""; 
    } 
} 

IL:被分配一個默認值作爲其聲明的一部分就會獲得這個值分配權前的構造是

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
{ 
    .maxstack 8 
    L_0000: ldarg.0 
    L_0001: ldstr "" 
    L_0006: stfld string ConsoleApplication1.Test::test1 
    L_000b: ldarg.0 
    L_000c: call instance void [mscorlib]System.Object::.ctor() 
    L_0011: nop 
    L_0012: ret 
} 
+0

所以我需要分配字符串「」,對不對? – devnull 2011-06-09 03:18:55

+0

是的,如果你想它是相等的「」,這是不一樣的空 – 2011-06-09 03:20:54

+0

是否有一些具體的原因,你想默認一個字符串空字符串而不是null?如果不是,那麼不,你不需要。 – Khepri 2011-06-09 03:21:19

0

在第二種情況,如果試圖在構造函數中引用mPersonNameInitializePerson分配給它之前,你會得到一個空引用異常,因爲字符串默認爲NULL。 int默認值爲0,所以這裏沒有問題。在第一種情況下,您不必擔心在構造函數中使用它們的位置,因爲您在類級別聲明瞭值。否則,沒有區別。