C#は、静的データメンバー間の依存関係を自動的に解決しますか?
-
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のロード時に初期化されます。
所属していません StackOverflow