Value type 内の型コンストラクターに関する質問があります。この質問は、Jeffrey Richter が C# 3rd ed を介して CLR で書いたものに触発されたもので、CLR が呼び出さない場合があるため、実際には値型内で型コンストラクターを定義するべきではないと彼は言います (195 ページ - 第 8 章)。それ。
したがって、たとえば (実際には...Jeffrey Richters の例)、IL を見ても、型コンストラクターが次のコードで呼び出されていない理由を理解できません。
internal struct SomeValType
{
static SomeValType()
{
Console.WriteLine("This never gets displayed");
}
public Int32 _x;
}
public sealed class Program
{
static void Main(string[] args)
{
SomeValType[] a = new SomeValType[10];
a[0]._x = 123;
Console.WriteLine(a[0]._x); //Displays 123
}
}
したがって、型コンストラクターに次の規則を適用すると、上記の値型コンストラクターがまったく呼び出されない理由がわかりません。
- 静的値型コンストラクターを定義して、型の初期状態を設定できます。
- 型には複数のコンストラクターを含めることはできません。デフォルトのコンストラクターはありません。
- 型コンストラクターは暗黙的にプライベートです
- JIT コンパイラは、型の型コンストラクターがこの AppDomain で既に実行されているかどうかを確認します。そうでない場合は、呼び出しをネイティブ コードに発行します。
だから...この型配列が構築されているのが見えない理由がわかりません。
私の最善の推測は、次のようになる可能性があるということです。
- CLR が型配列を構築する方法。最初のアイテムが作成されたときに静的コンストラクターが呼び出されると思っていたでしょう
- コンストラクターのコードは静的フィールドを初期化していないため、無視されます。コンストラクター内でプライベート静的フィールドを初期化して実験しましたが、フィールドはデフォルトの 0 値のままです。したがって、コンストラクターは呼び出されません。
- または...パブリックInt32が設定されているため、コンパイラーは何らかの方法でコンストラクター呼び出しを最適化しています-しかし、それはせいぜいあいまいな推測です!!
ベストプラクティスなどは別として、なぜ呼び出されないのかを自分で確認したいので、非常に興味をそそられます。
編集:私は以下の私自身の質問に答えを追加しました.Jeffrey Richterがそれについて言っていることの引用です.
誰かがアイデアを持っていれば、それは素晴らしいことです。どうもありがとう、ジェームズ