¿Cuándo se llama un constructor estático en C #?

Cuando tengo una clase que contiene un constructor estático, ¿se llama a ese constructor cuando el ensamblado que contiene la clase se carga por primera vez o cuando se golpea la primera referencia a esa clase?

Cuando se accede a la clase por primera vez.

Constructores estáticos (Guía de progtwigción C #)

Un constructor estático se usa para inicializar cualquier información estática, o para realizar una acción particular que necesita realizarse una sola vez. Se llama automáticamente antes de que se cree la primera instancia o se hace referencia a cualquier miembro estático.

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 aborda esta cuestión en detalle.

Resumen:

Se garantiza que el constructor estático se ejecutará inmediatamente antes de la primera referencia a un miembro de esa clase, ya sea creación de instancia o método propio / propiedad de clase.

Tenga en cuenta que los iniciadores estáticos (si no hay un constructor estático) garantizan que se ejecutarán en cualquier momento antes de la primera referencia a un campo particular.

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

Se garantiza que se llamará antes de que se acceda 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.

En caso de que se llame al método estático desde 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 } } 

Parece que hay un problema con los constructores estáticos que se responde en otro lugar, pero tardó un tiempo en resumirse en una explicación simple. Todos los documentos y explicaciones afirman que el constructor / intializadores estáticos se “garantiza” para ejecutarse antes de que se cree una instancia de la primera clase o se haga referencia al primer campo estático. El gotcha aparece cuando intentas poner un singleton estático en la clase que crea una instancia de sí mismo (pollo / huevo). En este caso, el constructor estático termina siendo llamado después del constructor de la instancia, y en mi caso el constructor de la instancia contenía un código que dependía de algunos datos estáticos.

¿Constructor estático llamado después del constructor de la instancia?

El constructor estático puede ejecutarse después del constructor no estático. ¿Es esto un error del comstackdor?

(la respuesta para mí fue poner el singleton en una clase separada o inicializar manualmente los datos estáticos en el constructor de la instancia antes de que se requiera)