2012-11-15 34 views
6

是什麼下面兩種情況之間的差異:這些對象如何實例化有什麼區別?

class Data 
{ 
    PersonDataContext persons = new PersonDataContext(); 
    public Data() {} 
} 

class Data 
{ 
    PersonDataContext persons; 
    public Data() 
    { 
     persons = new PersonDataContext(); 
    } 
} 

我在asp.net同樣的問題:

public partial class Data : System.Web.UI.Page 
{ 
    PersonDataContext persons = new PersonDataContext(); 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
} 

public partial class Data : System.Web.UI.Page 
{ 
    PersonDataContext persons; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     persons = new PersonDataContext(); 
    } 
} 

回答

3

字段初始值設定項在構造函數調用之前運行。因此,在情況1中,您的對象PersonDataContext將在構造函數調用之前創建。

PersonDataContext persons = new PersonDataContext(); 

第二種情況,你的構造將執行第一,然後它會初始化領域。

你可以做一個簡單的測試

class PersonDataContext 
{ 
    public PersonDataContext() 
    { 
     Console.WriteLine("In PersonDataContext Constructor"); 
    } 
} 
class Data 
{ 
    PersonDataContext persons = new PersonDataContext(); 
    public Data() 
    { 
     Console.WriteLine("In Data Contructor"); 
    } 
} 

class Data2 
{ 
    PersonDataContext persons; 
    public Data2() 
    { 
     Console.WriteLine("In Data2 Constructor"); 
     persons = new PersonDataContext(); 
    } 
} 

,然後在你的主要方法

static void Main(string[] args) 
{ 

    Data d1 = new Data(); 
    Data2 d2 = new Data2(); 
    Console.Read(); 
} 

輸出

在PersonDataContext構造//案例1

數據構造器//案例1

在數據2構造//案例2

在PersonDataContext構造//案例2


爲ASP例如,在第一種情況下你的字段被初始化的Page_Load事件之前,在第二種情況下,您的字段在Page_Load事件中初始化

+0

我清楚明白了。感謝你的例子。 – megazero

+0

不客氣@jerry – Habib

4

在第一種情況下,您在聲明的位置初始化變量。

第二,你在一個構造函數中初始化它。

主要區別在於,如果您有其他構造函數,並且忘記初始化或鏈接構造函數,則可以使用未初始化的變量。

+0

井,初始化爲默認的變量(T),其爲空引用類型。 .in c#你不能保留一個變量未初始化(這很容易)。 – eFloh

2

唯一的區別是創建對象的順序。如果我還記得,字段初始值設定項在構造函數之前運行,所以如果構造函數引用該字段,它已經在那裏。

但是從99.9%的情況來看,兩者之間不會有差異。在大多數情況下,直接初始化字段比較安全,在多重構造函數或派生類以及複雜層次結構的情況下,它會阻止您忘記它。

通常,構造函數用於使用外部參數來填充字段初始值設定項所不能使用的字段。

+0

對我來說是一次很好的體驗。字段初始化器直接在它上面,非常感謝。 – megazero

0

如果您使用對象的默認構造函數以外的構造方法,將會有unintialized variable for second case初始化 -

Data data = new Data(5); 

但是如果你chain parametized constructors to call default constructor這樣的 -

class Data 
{ 
    PersonDataContext persons; 
    public Data() 
    { 
     persons = new PersonDataContext(); 
    } 

    public Data(int a) : this() 
    { 

    } 
} 

變量persons將被初始化。

0

在你的第一個例子中,將不會有效的差異只要構造函數是唯一的構造函數。如果添加其他構造函數,則需要確保它們都初始化「人員」字段。

在ASP.NET示例中(對於第二個代碼段) - 您正在初始化Page_Load方法中的'persons'字段,這意味着使用此字段的任何其他方法可能會發現它未初始化。 (你的意思是Page_Load,還是你的意思是使它成爲一個構造函數...?)

底線是,如果'persons'字段總是需要非空,那麼作爲Field Initialiser初始化更安全...