2011-11-01 27 views
36

Específicamente, en relación con inicializadores de campo (en este caso, estática) - §17.11 en ECMA 334:¿Está formalmente definido el "orden textual" en las clases parciales?

Si una clase contiene todos los campos estáticos con inicializadores, esos inicializadores se ejecutan en orden textual inmediatamente antes de ejecutar el constructor estático

Ahora, si tenemos varias clases partial en archivos separados, ¿ese orden se determina en algún lugar? Mi instinto dice "no definido formalmente, pero probablemente se relaciona con el orden incluido en el csproj, o el orden señalado a csc". ¿Es esto correcto?

(y sí, me doy cuenta de que sería mejor evitar la ambigüedad por completo, probablemente moviendo toda la inicialización a un constructor estático).


Por ejemplo, si tengo 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(); 
    } 
} 

y b.cs:

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

y:

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

entonces este es Foo entonces Bar; Si, sin embargo, esto es:

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

entonces es Bar continuación Foo. Este admite la observación, pero no lo dice con fuerza. §8.7.13 (Declaraciones de tipo parciales) no hace ningún comentario sobre el orden al combinar las clases partial. Asi que; ¿Hay algo más fuerte que podamos decir aquí, ya sea de la especificación del lenguaje C# o de la documentación de herramientas?

Además, se comporta de manera similar con csc a.cs b.cs vs csc b.cs a.cs.

+2

muy buena pregunta –

Respuesta

18

Aquí hay otro fragmento de la especificación C# que, tomada con el fragmento, parece conformarse con que este es un comportamiento indefinido:

10.2.6 Miembros

[...] El orden de miembros dentro de un tipo raramente es significativo para código C#, pero puede ser significativo al interactuar con otros lenguajes y entornos. En estos casos, el orden de los miembros dentro de un tipo declarado en varias partes no está definido.

Para ser justos, sí dice raramente significativa, :) no despreciable.

2

Sé que esta pregunta es muy antigua, pero aquí es la parte correcta de la especificación:

ECMA-334 (C# Language Specification), inicializadores de variables, sección 17.4.5:

Cuando hay declaraciones de campo en múltiples declaraciones de tipo parcial para el mismo tipo, el orden de las partes no está especificado. Sin embargo, dentro de cada parte, los inicializadores de campo se ejecutan en el orden .

Así que el "orden textual" en tipos parciales no está definida, sino que es parcialmente definido. ;-)

Cuestiones relacionadas