Frage

Wenn ein statisches Datenmitglied von einem anderen statischen Datenmitglied abhängt, wird C#/. Netto garantiert, dass das abhängige statische Mitglied vor dem abhängigen Mitglied initialisiert wird?

Zum Beispiel haben wir eine Klasse wie:

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

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

Wann Foo.b Ist es aufgerufen, ist es immer "abcdef" oder kann "def" sein?

Wenn dies nicht garantiert ist, gibt es einen besseren Weg, um sicherzustellen, dass das Abhängige Mitglied zuerst initialisiert wurde?

War es hilfreich?

Lösung

Wie bereits erwähnt, ist die statische Feldinitialisierung deterministisch und verläuft nach der Bestellung der Textdeklaration.

Nehmen Sie dies zum Beispiel:

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

Foo.b wird immer zu "def" führen.

Wenn es eine Abhängigkeit zwischen statischen Feldern gibt, ist es besser, einen statischen Initialisierer zu verwenden:

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

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

Auf diese Weise äußern Sie Ihre Besorgnis über die Initialisierungsreihenfolge ausdrücklich. oder Abhängigkeit für diese Angelegenheit (auch wenn der Compiler nicht hilft, wenn Sie die Initialisierungsanweisungen versehentlich austauschen.) Die oben genannten werden die erwarteten Werte in A bzw. B ("ABC" und "ABCDEF" gespeichert).

Für die Initialisierung statischer Felder, die in mehreren Klassen definiert sind, können jedoch eine kurvige (und implementierende Implementierung spezifisch) werden. Die Sektion 10.4.5.1 statische Feldinitialisierung Von der Sprachspezifikation spricht etwas mehr darüber.

Andere Tipps

Es wird immer "abcdef" zeigen, da die Initialisierung heute wie zuvor in der Quelle oben nach unten geht.

Alle statischen Mitglieder werden beim Laden des Klasstyps initialisiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top