在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#和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中描述的字段,包括具有变量初始值设定项。因此,当类已初始化,全部为静态该类中的字段是第一个初始化为它们的默认值,然后是静态字段初始化程序按文本顺序执行。同样,当类的实例中的所有实例字段该实例首先初始化为它们的默认值,然后实例字段初始值设定项是按文本顺序执行。
因此,基本上,私有成员初始化和构造初始化之间没有区别——编译器将按文本顺序将其放入对象的所有实例初始化例程。