C#は、静的データメンバー間の依存関係を自動的に解決しますか?

StackOverflow https://stackoverflow.com/questions/1727301

  •  19-09-2019
  •  | 
  •  

質問

1人の静的データメンバーが別の静的データメンバーに依存している場合、c#/。ネット保証は、依存した静的メンバーが依存メンバーの前に初期化されますか?

たとえば、次のようなクラスが1つあります。

class Foo
{
    public static string a = "abc";

    public static string b = Foo.a + "def";
}

いつ foo.b アクセスされますか、それは常に「abcdef」ですか、それとも「def」になることができますか?

これが保証されていない場合、最初にメンバーが初期化されたことを確認するためのより良い方法はありますか?

役に立ちましたか?

解決

前に言ったように、静的フィールドの初期化は決定論的であり、テキスト宣言の注文に従って進みます。

たとえば、これを考えてみましょう。

class Foo
{
    public static string b = a + "def";
    public static string a = "abc";
}

foo.bは常に「def」になります。

さらに言えば、静的フィールド間に依存関係がある場合は、静的初期イザーを使用することをお勧めします。

class Foo
{
    public static string b;
    public static string a;

    static Foo()
    {
        a = "abc";
        b = a + "def";
    }
}

そうすれば、初期化の順序に関する懸念を明示的に表明します。またはその問題の依存関係(初期化ステートメントを誤って交換してもコンパイラが役に立たない場合でも)上記は、AとB(それぞれ「ABC」と「ABCDEF」)に格納されます。

ただし、複数のクラスで定義された静的フィールドの初期化のために、物事はねじれ(および実装固有)になる可能性があります。セクション 10.4.5.1静的フィールド初期化 言語仕様については、それについてもう少し語っています。

他のヒント

初期化は、今日と同じように、初期化がソースでトップダウンするため、常に「ABCDEF」を表示します。

すべての静的メンバーは、それらを保持しているClasStypeのロード時に初期化されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top