据我所知,父类的构造函数先调用然后调用子类.但是为什么在静态构造函数的情况下它首先从派生类执行,然后是子类?
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
子静态构造函数
父静态构造函数
父实例构造函数
子实例构造函数
现在按照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");
}
}
Run Code Online (Sandbox Code Playgroud)
为何如此矛盾的行为呢?
Eri*_*ert 20
首先,这种行为完全不矛盾; 这一切都符合规则.你只是不知道规则是什么.
您应该阅读我关于实例构造函数的两部分系列文章以及关于静态构造函数语义的四部分系列文章.他们从这里开始:
和这里:
http://ericlippert.com/2013/02/06/static-constructors-part-one/
分别.
那些应该清楚地回答你的问题,但如果不是100%明确,请让我总结一下.相关规则是:
那么当你执行时会发生什么new Child()?
所以你去; 顺序是Child静态构造函数,然后是Parent静态构造函数,然后是Parent主体,然后是Child主体.
现在让我们看看你的第二个例子.你说什么会发生什么new XyzChild?
你去吧 没有任何不一致之处; 这两个规则正确应用.
Static构造函数总是在非静态构造函数之前执行.第一次访问类时调用静态构造函数.
来自MSDN Doc,