2009-09-17 24 views

Respuesta

79

Cuando se accede a la clase por primera vez.

Static Constructors (C# Programming Guide)

Un constructor estático se utiliza para inicializar los datos estáticos, o para realizar una acción particular que debe realizarse una vez solamente. Se llama automáticamente antes de que se cree la primera instancia o se hace referencia a cualquier miembro estático.

+0

Gracias, eso tiene sentido cuando pienso en ello correctamente! – Jason

+5

Es interesante que dice "antes de crear la primera instancia o se hace referencia a cualquier miembro estático". Hay un margen de acción allí en * cuando * en realidad se invoca. –

+5

@TimBarrass debido a algunos otros requisitos de especificación resulta que "antes" es en realidad "inmediatamente anterior" - ver el artículo de Jon Skeet mencionado en otra respuesta - http://stackoverflow.com/a/1437372/477420 –

34

No es tan simple como cabría esperar a pesar de la documentación directa. El artículo de Jon Skeet http://csharpindepth.com/Articles/General/Beforefieldinit.aspx entra en esta cuestión en detalles.

Resumen:

constructor estático está garantizada para ser ejecutado inmediatamente antes de la primera referencia a un miembro de esa clase - ya sea creación de instancia o propio método/propiedad estática de la clase.

Tenga en cuenta que initilaizers estáticos (si no hay un constructor estático) garantizada para ser ejecutado en cualquier momento antes de la primera referencia al campo en particular.

+0

+1. Muéstremelo, solo que sin embargo. ;) – AnthonyWJones

+0

Es una lectura muy interesante, gracias caballeros. – Jason

+0

El artículo mencionado se encuentra ahora en el sitio de Jon Skeet: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy

17

Se llama al constructor estático antes de usar algo en la clase, pero exactamente cuando eso sucede depende de la implementación.

Se garantiza que se llamará antes de acceder al primer miembro estático y antes de que se cree la primera instancia. Si nunca se utiliza la clase, no se garantiza que se invoque el constructor estático.

+2

Cuando sucede * no es * "hasta la implementación" si esa implementación sigue la especificación ECMA C#: "La ejecución de un constructor estático se desencadena por el primero de los siguientes eventos que ocurren dentro de un dominio de aplicación: [1] se crea la instancia de la clase. [2] Se hace referencia a cualquiera de los miembros estáticos de la clase ". (Sección 17.11, http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH

+0

@Luke: "El momento exacto de la ejecución del constructor estático depende de la implementación" http://ondotnet.com/pub/a/dotnet/2003/07/07/staticxtor.html – Guffa

+2

@Guffa: Esa podría ser la interpretación del autor del artículo, pero no encontrará esa redacción en las versiones de Microsoft o ECMA/ISO de la especificación C#. – LukeH

0

En caso de que se llame al método estático de la clase padre, no se llamará al constructor estático, aunque esté explícitamente especificado. Aquí hay un ejemplo b No se llama al constructor si se llama a b.methoda().

static void Main(string[] args) 
{ 
    b.methoda(); 
} 

class a 
{ 
    public static void methoda() 
    { 
     //using initialized method data 
    } 
} 

class b : a 
{ 
    static b() 
    { 
     //some initialization 
    } 
}  
Cuestiones relacionadas