C#でシングルトンを構築するための最良の方法を調査しているときに、C++で簡単に言及されている次の記事に出くわしました。
「C++仕様では、静的変数の初期化順序にあいまいさが残っています。」
私は結局質問を調べて、これとこれを見つけました。基本的に(私が理解している限り)重要なのは、C++での静的変数の初期化順序が未定義であるということです。さて、これまでのところとても良いと思いますが、その後、記事が後で行う次のステートメントを理解したいと思いました
「幸いなことに、.NET Frameworkは、変数の初期化を処理することで、このあいまいさを解決しています。」
だから私は彼らが言うこのページを見つけました
クラスの静的フィールド変数初期化子は、クラス宣言に表示されるテキストの順序で実行される一連の割り当てに対応します。
の例を挙げてください
using System;
class Test
{
static void Main() {
Console.WriteLine("{0} {1}", B.Y, A.X);
}
public static int F(string s) {
Console.WriteLine(s);
return 1;
}
}
class A
{
static A() {}
public static int X = Test.F("Init A");
}
class B
{
static B() {}
public static int Y = Test.F("Init B");
}
the output must be:
Init B
Init A
1 1
「静的コンストラクターの実行時のルール(セクション10.11で定義)では、Bの静的コンストラクター(したがってBの静的フィールド初期化子)は、Aの静的コンストラクターとフィールド初期化子の前に実行する必要があると規定されているためです。」
しかし、私が混乱しているのは、これらの例の静的変数の初期化順序は、クラス内のメソッドまたはフィールドが最初に呼び出されたとき、つまりコードブロックの実行順序に基づいているということです。 (この場合は左から右)。IE:クラス宣言の場所(または順序)に完全に依存しません。しかし、その記事の私の解釈によれば、それはそれらのクラスの宣言の順序の結果であると言っていますが、私のテストはバックアップしていませんか?
誰かが私のためにこれ(そして記事が作ろうとしているポイント)を明確にして、おそらく記述された振る舞いを非識字にするより良い例を提供してくれませんか?