2009-09-29 4 views
38

dato il seguente codice:inizializzazione Ordine di Static campi in Static Classe

public static class Helpers 
{ 
    private static Char[] myChars = new Char[] {'a', 'b'}; 

    private static Int32 myCharsSize = myChars.Length; 
} 

si garantisce che myChars verrà inizializzato prima Io uso la sua lunghezza da assegnare a myCharsSize?

risposta

43

Sì, si, si prega di consultare 10.4.5.1 Static field initialization:

Il campo statico initializers variabili di una classe corrispondono ad una sequenza di incarichi che vengono eseguiti secondo l'ordine testuale in cui appaiono nel la dichiarazione di classe. Se un statico costruttore (Sezione 10.11) esiste nella classe, esecuzione delle statiche inizializzatori campo si verifica immediatamente prima dell'esecuzione che costruttore statico. In caso contrario, gli inizializzatori di campo statici vengono eseguiti in un tempo dipendente dall'implementazione prima di il primo utilizzo di un campo statico di classe .

Detto questo, penso che sarebbe meglio fare l'inizializzazione all'interno di un inizializzatore di tipo statico (costruttore statico).

+3

Cura di citare le prove? –

+2

Molto meglio ;-p –

+0

@Marc - LOL, ho postato "sì" quindi sarei il primo e poi sono tornato con le prove. Dato che non posso più essere la FGTW, immagino che non dovrei preoccuparmi di essere la prima volta: D –

11

Hmm ... Sono sorpreso che compila (lo fa, ho controllato). Non sono a conoscenza di alcuna garanzia che lo renderebbe sicuro. Utilizzare un costruttore statico ...


Edit: Accetto (vedi better answer above) che funzionerà; ma la mia idea con il codice è di mantenerla il più semplice e ovvia possibile. Se non è ovvio che funzionerà (e non può essere se si deve chiedere), quindi non scrivere in questo modo ...

In particolare, i problemi con basandosi su ordine di campo :

  • si può rompere se si sposta il codice in giro (che spesso faccio)
  • si può rompere se si divide il codice in partial classi

il mio consiglio rimane: utilizzare un costruttore statico per questo scenario.

+1

+1 Questo consiglio è valido - solo perché tu fai qualcosa non significa che dovresti. Penso che un costruttore statico sia la strada da percorrere anche se il linguaggio supporta questo tipo di inizializzazione del campo. –

+0

Sebbene sia possibile scrivere codice molto più conciso con gli inizializzatori di proprietà/campo statici (digitando il nome della proprietà una volta per proprietà anziché due volte una volta nella definizione e una volta nella funzione di inizializzazione statica). In alcuni casi, questa potrebbe essere la differenza tra un file di origine che si adatta a uno schermo o che richiede lo scorrimento per visualizzarlo completamente. Dipende dal tuo obiettivo. Se si desidera disporre manualmente le proprietà in un ordine diverso da quello che devono essere inizializzate, allora sì, una funzione di inizializzazione statica scritta manualmente è l'unica scelta possibile. – binki

0

A prima vista, non sarei sicuro, e ho dovuto provare questo per vedere se anche compilato.

Dato che, vorrei inizializzare il valore in un costruttore statico.