Questo è un esempio di una possibile differenza:
class SimpleClass
{
static readonly long A = DateTime.Now.Ticks;
static readonly long B = DateTime.Now.Ticks;
static SimpleClass()
{
}
}
A
e B
non sono garantiti per essere lo stesso valore, ma se si dovesse scrivere nel costruttore, si potrebbe garantirla:
class SimpleClass
{
static readonly long A;
static readonly long B;
static SimpleClass()
{
var ticks = DateTime.Now.Ticks;
A = ticks;
B = ticks;
}
}
Inoltre, l'ordine è soggetto a per l'istanziazione di membri statici.
Secondo ECMA-334 in relazione al campo di inizializzazione statico:
del campo statico initializers variabili di una dichiarazione di classe corrispondono ad una sequenza di compiti che vengono eseguiti nell'ordine testuale in cui appaiono nella dichiarazione di classe. Se nella classe è presente un costruttore statico (§17.11), l'esecuzione degli inizializzatori di campo statici si verifica immediatamente prima dell'esecuzione di tale costruttore statico . In caso contrario, gli inizializzatori campo statico sono eseguiti in un momento implementazione-dipendente prima del primo utilizzo di un campo statico di quella classe
Quindi, possiamo scrivere qualcosa del genere:
class SimpleClass
{
public static readonly long A = IdentityHelper.GetNext();
public static readonly long B = IdentityHelper.GetNext();
static SimpleClass()
{
}
}
public static class IdentityHelper
{
public static int previousIdentity = 0;
public static int GetNext()
{
return ++previousIdentity;
}
}
Qui, è garantito che lo A
sia assegnato prima dello B
. In questo esempio, A
sarà 1
e B
sarà 2
. Possiamo garantire che A
< B
(presupponendo che l'identità non esca e non ci siano problemi con il threading). Ora, se noi riordinare i campi:
public static readonly long B = IdentityHelper.GetNext();
public static readonly long A = IdentityHelper.GetNext();
La funzionalità cambia. Pertanto, abbiamo creato un effetto collaterale che non è immediatamente chiaro semplicemente riordinando le definizioni dei campi.
Uno scenario più probabile è, si può decidere di fare questo:
class SimpleClass
{
public static readonly long A = IdentityHelper.GetExpensiveResult().A;
public static readonly long B = IdentityHelper.GetExpensiveResult().B;
static SimpleClass()
{
}
}
Qui, non siamo in grado di condividere GetExpensiveResult()
tra i campi.
Questa non è una domanda statica specifica, la domanda è valida anche per l'inizializzazione non statica. –
Possibile duplicato di [Inizializza campi di classi nel costruttore o nella dichiarazione?] (Http://stackoverflow.com/questions/24551/initialize-class-fields-in-constructor-or-at-declaration) –
@CyrilGandon Che non è un dupe: si tratta di costruttori statici che non accettano parametri. Prendi in considerazione la rimozione del tag dupe. –