在C#中,什么首先触发,私有成员变量或构造函数,以及为什么

本文关键字:变量 成员 构造函数 为什么 什么 | 更新日期: 2023-09-27 18:00:11

如果我有一个类,比如:

public class A
{
     public A(string name)
     {
         Console.WriteLine("Mon");
     }
}
public class B
{
    private A m_a = new A("Tues");
    public B()
    {
        m_a = new A("Wed");
    }
}

我不在windows机器上,所以我无法测试输出。

会是什么,但更重要的是,为什么会是这样?

即,为什么私有var在构造函数之前被实例化,反之亦然。或者一个会被忽略或只是被重写?

Java会是同样的行为吗?

在C#中,什么首先触发,私有成员变量或构造函数,以及为什么

在C#和Java中,构造函数外部的所有初始化都先于对构造函数的任何调用。构造函数中的赋值将覆盖其他赋值。

对于C#,您至少可以在第10.11节中看到语言规范的详细信息。这应该可以回答排序的任何细节,尤其是在涉及继承的情况下。

我不知道它在Java中是如何工作的(可能是一样的),但在C#中,成员变量在构造函数运行之前被实例化。至于为什么,我从来没有想过,我也不知道最好的答案,但一个务实的答案是,成员变量在构造函数中是可用的,已经实例化了。

变量初始值设定项(在类中)在该类的构造函数之前调用。因此,私有A m_a = new A("Tues")将在m_a = new A("Wed")之前调用,因为构造函数可能需要使用私有变量的值。我认为Java也是这样做的,但我现在还不能测试它。

根据C#规范17.4.5变量初始化程序:

例如字段、变量初始值设定项对应于赋值当类的实例被创建。

所有字段都有默认值初始化器,无论字段是否有变量初始化器,都会运行:

默认值初始化1.4.3中描述的字段,包括具有变量初始值设定项。因此,当类已初始化,全部为静态该类中的字段是第一个初始化为它们的默认值,然后是静态字段初始化程序按文本顺序执行。同样,当类的实例中的所有实例字段该实例首先初始化为它们的默认值,然后实例字段初始值设定项是按文本顺序执行。

因此,基本上,私有成员初始化和构造初始化之间没有区别——编译器将按文本顺序将其放入对象的所有实例初始化例程。