、、の3つのクラスがBase
ありDerived
ますFinal
。Derived
から派生しBase
、からFinal
派生しDerived
ます。3つのクラスすべてに静的コンストラクターがあります。Derived
と呼ばれるパブリック静的メソッドとしてのクラスSetup
。を呼び出すとFinal.Setup
、3つの静的コンストラクターがすべて実行されると思いますが、実行されるのは1つだけDerived
です。
サンプルソースコードは次のとおりです。
abstract class Base
{
static Base()
{
System.Console.WriteLine ("Base");
}
}
abstract class Derived : Base
{
static Derived()
{
System.Console.WriteLine ("Derived");
}
public static void Setup()
{
System.Console.WriteLine ("Setup");
}
}
sealed class Final : Derived
{
static Final()
{
System.Console.WriteLine ("Final");
}
}
これは私には部分的にしか意味がありません。Final.Setup()
呼び出しは実際にはのエイリアスにすぎないことを理解しているDerived.Setup()
ので、で静的コンストラクターをスキップすることはFinal
十分に公平に思えます。しかし、なぜ静的コンストラクターがBase
呼び出されないのですか?
これを修正するには、のno-operation静的メソッドを呼び出すBase
か、のダミー静的メソッドにアクセスしBase
ます。しかし、私は疑問に思っていました:この明らかに奇妙な行動の背後にある理由は何ですか?