namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Child t = new Child();
}
}
class Parent
{
public Parent()
{
Console.WriteLine("Parent Instance Constructor");
Console.ReadKey();
}
static Parent()
{
Console.WriteLine("Parent Static Constructor");
Console.ReadKey();
}
}
class Child : Parent
{
public Child()
{
Console.WriteLine("Child Instance Constructor");
Console.ReadKey();
}
static Child()
{
Console.WriteLine("Child Static Constructor");
Console.ReadKey();
}
}
}
输出:
子类静态构造函数
父类静态构造函数
父类实例构造函数
子类实例构造函数
现在根据 Jeppe Stig Nielsen 的建议,当我在构造函数中初始化静态字段时,它的执行顺序如下:
输出:
父类静态构造函数
子类静态构造函数
父类实例构造函数
子类实例构造函数
class XyzParent
{
protected static int FieldOne;
protected int FieldTwo;
static XyzParent()
{
// !
FieldOne = 1;
Console.WriteLine("parent static");
}
internal XyzParent()
{
// !
FieldOne = 10;
// !
FieldTwo = 20;
Console.WriteLine("parent instance");
}
}
class XyzChild : XyzParent
{
static XyzChild()
{
// !
FieldOne = 100;
Console.WriteLine("child static");
}
internal XyzChild()
{
// !
FieldOne = 1000;
// !
FieldTwo = 2000;
Console.WriteLine("child instance");
}
}
为什么会出现这种矛盾的行为?
Parent
添加两个字段,一个是静态字段,一个是实例字段,那么这将更有趣。然后构造函数应该分配给这些字段。静态构造函数只能分配给静态字段,但实例构造函数可以分配给两个字段。那么构造函数会按照相同的顺序运行吗? - Jeppe Stig Nielsen// !
的地方加入Console.WriteLines,阅读我的答案,重新运行代码,看看你是否现在明白了这里发生了什么。这里并没有矛盾。 - Eric Lippert