C#の静的コンストラクターに関するドキュメントには次のように書かれています。
静的コンストラクターは、静的データを初期化するため、または1回だけ実行する必要がある特定のアクションを実行するために使用されます。最初のインスタンスが作成される前、または静的メンバーが参照される前に、自動的に呼び出されます。
その最後の部分(それが自動的に呼び出されるときについて)は私をループに投げ込みました。その部分を読むまでは、何らかの方法でクラスにアクセスするだけで、その基本クラスの静的コンストラクターが呼び出されたことを確認できると思いました。ドキュメントをテストおよび調査したところ、これは当てはまらないことが明らかになりました。基本クラスの静的コンストラクターは、その基本クラスのメンバーが具体的にアクセスされるまで実行されることが保証されていないようです。
さて、ほとんどの場合、派生クラスを扱っているときは、インスタンスを作成し、これが作成中の基本クラスのインスタンスを構成するため、静的コンストラクターが呼び出されると思います。しかし、派生クラスの静的メンバーのみを扱っている場合はどうなりますか?
これをもう少し具体的にするために、私は以下のコードが機能すると思いました:
abstract class TypeBase
{
static TypeBase()
{
Type<int>.Name = "int";
Type<long>.Name = "long";
Type<double>.Name = "double";
}
}
class Type<T> : TypeBase
{
public static string Name { get; internal set; }
}
class Program
{
Console.WriteLine(Type<int>.Name);
}
クラスにアクセスすると、;Type<T>
の静的コンストラクターが自動的に呼び出されると思いました。TypeBase
しかし、そうではないようです。Type<int>.Name
はnull
、であり、上記のコードは空の文字列を出力します。
ダミーメンバー(Initialize()
何もしない静的メソッドなど)を作成する以外に、派生型のいずれかが使用される前に、基本型の静的コンストラクターが呼び出されるようにするためのより良い方法はありますか?
そうでなければ...ダミーメンバーです!