2011-11-27 5 views
11

Il seguente codice:Perché l'inizializzazione dei campi statici si verifica prima del costruttore statico?

static void Main(string[] args) 
{ 
    Console.WriteLine("0"); 
    string h = Foo.X; 
    Console.WriteLine("2"); 
} 

public static class Foo 
{ 
    public static string X = ((Func<string, string>)delegate(string g) 
    { 
     Console.WriteLine(g); 
     return (g); 
    })("_aaa"); 

    static Foo() 
    { 
     Console.WriteLine("ctor"); 
    } 
} 

stamperà:

0 
_aaa 
ctor 
2 

So del beforefieldinit comportamento (con/senza costruttore statico, ecc).

La cosa che io Non capire è perché il ctor (in uscita) è dopo_aaa?

Non ha senso, cosa succede se voglio inizializzare le variabili nel costruttore?

Domanda

Perché l'inizializzazione di X è prima del ctor?

+0

È simile per i campi non statici e per i costruttori non statici, ovviamente: 'class Foo {public string X =" A "; public Foo() {X = "B"; }} 'Con questo, se lo fai' (nuovo Foo()). X', ottieni '" B "', non '" A "', perché l'assegnazione di '" B "' è avvenuta per ultima (ha sovrascritto il primo valore). –

+0

@JeppeStigNielsen Grazie per il chiarimento –

risposta

17

Il motivo ctor è dopo che gli inizializzatori di campo è perché è il modo in cui è specificato. Dalla descrizione C# (enfasi è mia):

10.5.5.1 statica inizializzazione campo Il campo inizializzatori variabili statici di una classe corrispondono ad una sequenza di assegnazioni che vengono eseguiti nell'ordine testuale in cui appaiono nella classe dichiarazione. Se nella classe è presente un costruttore statico (§10.12), l'esecuzione degli inizializzatori di campo statici è immediatamente precedente a nell'esecuzione di tale costruttore statico. In caso contrario, le statiche campo initializers vengono eseguiti in un momento implementazione-dipendente prima il primo uso di un campo statico di quella classe

Se si desidera avere il controllo totale del vostro ordine di inizializzazione, spostare tutto all'interno del costruttore.

+0

grazie mille ... –

Problemi correlati