2010-08-26 9 views
6

espera que la producción de salida & me sale en modo de depuración, y el modo de liberar bajo VS2010, .NET 4.0:Variable estática no iniciada en Release - Compiler/clr bug?

bar construct 
main 

de salida en modo de lanzamiento no en el depurador VS2010, y bajo WinDbg:

Programa
main 

no presenta este comportamiento en VS2005, .NET 2.0

using System; 

namespace static_init 
{ 
    public class bar 
    { 
     public bar() 
     { 
      Console.WriteLine("bar construct"); 
     } 
    } 

    class Program 
    { 
     public static bar blah = new bar(); 

     static void Main(string[] args) 
     { 
      Console.WriteLine("main"); 
      Console.ReadLine(); 
     } 
    } 
} 

probablemente relacionadas: Static constructor can run after the non-static constructor. Is this a compiler bug?

actualización

En mi constructor de código real bar() inicializa un cierto código de interoperabilidad con C++ (no administrado). Tiene que suceder antes que cualquier otra cosa en esta biblioteca: ¿hay alguna manera de garantizar que no se ingrese una función init() que toque todas las estáticas (con efectos secundarios que no se mencionan externamente) en la biblioteca?

Nota para futuros buscadores: Estoy usando SWIG, y esta es una suposición que hicieron en su código de generación de envoltura. SWIGStringHelper es el delincuente actual, sin embargo, puede haber más.

Conclusión

actualización a la versión 2.0 de TRAGO, se pone en el constructor estático, según sea necesario por una versión más reciente de .NET.

+0

Muchas gracias por 'Actualizar' y 'Conclusión' - Tengo un escenario muy similar y también utilicé el viejo SWIG 1.3.40 - recién actualizado a 2.0.9 y todo funciona bien. "Conclusión" ¡me ahorra mucho tiempo para investigar! – sergtk

Respuesta

10

Probablemente esté siendo optimizado porque no lo usa.

Tampoco es un error del compilador, está en la especificación del idioma.

17.4.5.1 campo estático inicialización

campo estático inicializadores de variables de una declaración de clase corresponden a una secuencia de tareas que se ejecutados en el orden textual en el que que aparecen en el declaración de clase Si existe un constructor estático (§17.11) en la clase, la ejecución de los inicializadores de campo estáticos se produce inmediatamente antes de ejecutar el constructor estático . De lo contrario, los inicializadores de campo estático se ejecutan en un momento dependiente de la implementación antes del primer uso de un campo estático de la clase

Dado que nunca se utiliza un campo estático de la clase del Programa, el iniciador estático no está garantizado para ejecutarse (aunque podría ...el 'tiempo dependiente de la implementación' arriba)

actualización
Puede lograr lo que desea haciendo Programa tiene un constructor estático.

static Program(){} o posiblemente mediante el acceso a otro (posiblemente ficticio) variable estática

6

Tenga en cuenta que se han producido algunos cambios en .NET 4.0 relacionados con la inicialización estática. Jon Skeet ha escrito un post con algunas muestras:

Type initialization changes in .NET 4.0

Si desea inicialización precisa, se debe utilizar un constructor estático (que puede estar vacía).

Cuestiones relacionadas