2011-11-01 6 views
36

In particolare, in relazione alla inizializzatori campo (in questo caso, statico) - §17.11 in ECMA 334:L'"ordine testuale" tra classi parziali è definito in modo formale?

Se una classe contiene i campi statici con initializers, tali initializers vengono eseguiti in ordine testuale immediatamente prima dell'esecuzione il costruttore statico.

Ora, se abbiamo più classi partial in file separati, l'ordine è determinato ovunque? Il mio istinto dice "non definito formalmente, ma probabilmente si riferisce all'ordine incluso nel csproj, o all'ordine annotato a csc". È corretto?

(e sì, mi rendo conto che sarebbe meglio evitare completamente l'ambiguità, probabilmente spostando tutte le inizializzazioni in un costruttore statico).


Per esempio, se ho a.cs:

using System; 
partial class Program 
{ 
    private static int Foo = Write("Foo"); 
    static int Write(string name) 
    { 
     Console.WriteLine(name); 
     return 0; 
    } 
    static void Main() 
    { 
     Console.WriteLine("[press any key]"); 
     Console.ReadLine(); 
    } 
} 

e b.cs:

partial class Program 
{ 
    private static int Bar = Write("Bar"); 
} 

e:

<Compile Include="a.cs" /> 
<Compile Include="b.cs" /> 

allora questo è Foo poi Bar; se, tuttavia, questo è:

<Compile Include="b.cs" /> 
<Compile Include="a.cs" /> 

allora è Bar poi Foo. Questo supporta l'osservazione, ma non lo dichiara fortemente. §8.7.13 (Dichiarazioni di tipo parziale) non commenta l'ordine quando combina le classi partial. Così; c'è qualcosa di più forte che possiamo dire qui, dalle specifiche del linguaggio C# o dalla documentazione degli strumenti?

Inoltre, si comporta allo stesso modo con csc a.cs b.cs rispetto a csc b.cs a.cs.

+2

domanda molto bella –

risposta

18

Ecco un altro frammento della C# spec che, preso con il frammento, sembra risolvere che questo è un comportamento indefinito:

10.2.6 Utenti

[...] L'ordinamento dei membri all'interno di un tipo è raramente significativo per il codice C# , ma può essere significativo quando si interfaccia con altre lingue e ambienti. In questi casi, , l'ordine dei membri all'interno di un tipo dichiarato in più parti non è definito.

Per essere onesti, non dice raramente significativo, :) non trascurabile.

2

So che questa domanda è molto vecchio, ma qui è la parte corretta del disciplinare:

ECMA-334 (linguaggio C# Specification), inizializzatori variabili, sezione 17.4.5:

Quando esistono dichiarazioni di campo in più dichiarazioni di tipo parziale per lo stesso tipo, l'ordine delle parti non è specificato. Tuttavia, all'interno di ciascuna parte gli inizializzatori di campo vengono eseguiti nell'ordine .

Così l ' "ordine testuale" in parziali tipi non è definito, piuttosto è parzialmente definito. ;-)

Problemi correlati