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();
    }
}
4

6 回答 6

4

在第一种情况下,您在声明位置初始化变量。

在第二个中,您在构造函数中对其进行初始化。

主要区别在于,如果您有其他构造函数并且忘记初始化或链接构造函数,则可以有一个未初始化的变量。

于 2012-11-15T12:22:45.607 回答
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();
    }
}

然后在你的 Main 方法中

static void Main(string[] args)
{

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

输出

在 PersonDataContext 构造函数中 // 案例 1

在数据构造器中 //案例 1

在 Data2 构造函数中 //案例 2

在 PersonDataContext 构造函数中 // 案例 2


对于 asp 示例,在第一种情况下,您的字段在事件之前初始化,在第二种情况下,您的字段在事件Page_Load中初始化Page_Load

于 2012-11-15T12:29:42.363 回答
3

在您的第二个示例中,主要区别在于 Page_Load 只是处理请求时调用的众多 ASP.NET 事件之一。因此,在 Page_Load 之前引发的事件将无法访问/使用该字段,因为它尚未被初始化。

检查 ASP.NET 页面生命周期:http: //msdn.microsoft.com/en-us/library/ms178472%28v=vs.100%29.aspx

于 2012-11-15T12:40:01.947 回答
2

唯一的区别是创建对象的顺序。如果我没记错的话,字段初始化程序在构造函数之前运行,因此如果构造函数引用了该字段,它就已经存在了。

但从 99.9% 的案例来看,你不会看到两者之间有什么不同。在大多数情况下,直接在其上初始化字段会更安全,这样可以防止您在多个构造函数或派生类和复杂层次结构的情况下忘记它。

通常,构造函数用于获取外部参数来填充字段初始值设定项无法使用的字段。

于 2012-11-15T12:24:45.457 回答
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将被初始化。

于 2012-11-15T12:37:14.317 回答
0

在您的第一个示例中,只要构造函数是唯一的构造函数,就不会有有效的区别。如果您添加其他构造函数,那么您需要确保它们都初始化“人员”字段。

在 ASP.NET 示例中(对于第二个代码片段) - 您正在初始化 Page_Load 方法中的“persons”字段,这意味着使用此字段的任何其他方法可能会发现它未初始化。(你的意思是Page_Load,还是你的意思是让它成为一个构造函数......?)

底线是,如果“persons”字段始终需要为非空,则将其初始化为字段初始化器会更安全...

于 2012-11-15T12:38:31.413 回答