这些对象的实例化方式有何不同?

Tuy*_*yen 6 c# asp.net object-initialization

以下两种情况有什么区别:

class Data
{
    PersonDataContext persons = new PersonDataContext();
    public Data() {}
}
Run Code Online (Sandbox Code Playgroud)

class Data
{
    PersonDataContext persons;
    public Data() 
    {
        persons = new PersonDataContext();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在asp.net中有同样的问题:

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

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

Hab*_*bib 3

字段初始值设定项在构造函数调用之前运行。因此,在情况 1 中,您的对象PersonDataContext将在构造函数调用之前创建。

PersonDataContext persons = new PersonDataContext();
Run Code Online (Sandbox Code Playgroud)

第二种情况下,您的构造函数将首先执行,然后初始化该字段。

你可以做一个简单的测试

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的 Main 方法中

static void Main(string[] args)
{

    Data d1 = new Data();
    Data2 d2 = new Data2();
    Console.Read();
}
Run Code Online (Sandbox Code Playgroud)

输出

在 PersonDataContext 构造函数中 // 情况 1

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

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

在 PersonDataContext 构造函数中 // 情况 2


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