2012-11-15 35 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初始化更安全...