9

1つの静的データメンバーが別の静的データメンバーに依存している場合、C#/。NETは、依存する静的メンバーが依存するメンバーの前に初期化されることを保証しますか?

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

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

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

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

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

4

2 に答える 2

9

前に述べたように、静的フィールドの初期化は決定論的であり、テキスト宣言の順序に従って行われます。

たとえば、次のようにします。

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言語仕様の静的フィールドの初期化では、それについてもう少し説明しています。

于 2009-11-13T05:51:20.017 に答える
2

今日も以前と同じように、ソースのトップダウンで初期化が行われるため、常に「abcdef」と表示されます。

すべての静的メンバーは、それらを保持するクラスタイプのロード時に初期化されます。

于 2009-11-13T05:36:16.787 に答える