Domanda

Se un membro dei dati statici dipende da un altro membro dei dati statici, C#/. Garantisce netto che il membro statico dipendente viene inizializzato prima del membro dipendente?

Ad esempio, abbiamo una classe come:

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

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

quando Foo.b è accessibile, è sempre "abcdef" o può essere "def"?

Se questo non è garantito, esiste un modo migliore per assicurarsi che il membro dipendente inizializzato prima?

È stato utile?

Soluzione

Come detto prima, l'inizializzazione del campo statico è deterministica e va in base all'ordinamento della dichiarazione testuale.

Prendi questo, per esempio:

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

Foo.b si tradurrà sempre in "def".

Del resto, quando c'è una dipendenza tra i campi statici, è meglio usare un inizializzatore statico:

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

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

In questo modo, esprimi esplicitamente la tua preoccupazione per l'ordine di inizializzazione; o dipendenza per quella materia (anche se il compilatore non aiuterà se si scambia accidentalmente le dichiarazioni di inizializzazione.) Quanto sopra avrà i valori previsti memorizzati in A e B (rispettivamente "ABC" e "ABCDEF").

Tuttavia, le cose potrebbero diventare torte (e specifiche dell'implementazione) per l'inizializzazione di campi statici definiti in più classi. La sezione 10.4.5.1 Inizializzazione del campo statico delle specifiche linguistiche ne parlano ancora un po '.

Altri suggerimenti

Mostrerà sempre "ABCDEF", perché l'inizializzazione va in cima alla fonte, oggi proprio come prima.

Tutti i membri statici saranno inizializzati al carico del classype che li tiene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top