私が知っているように、親クラスのコンストラクターが最初に呼び出され、次に子クラスが呼び出されますが、静的コンストラクターの場合、最初に派生クラス、次に子クラスから実行されるのはなぜですか?
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");
}
}
なぜそのような矛盾した行動?