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?
88
Cuando se accede a la clase por primera vez.
Constructores estáticos (Guía de programación de C #) Static Constructors (C # Programming Guide)
Un constructor estático se usa para inicializar cualquier dato estático 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 haga referencia a cualquier miembro estático.
A static constructor is used to initialize any static data
NO. Es mejor usarlostatic initializer
para inicializar cosas estáticas.No es tan simple como cabría esperar a pesar de la documentación sencilla. El artículo de Jon Skeet http://csharpindepth.com/Articles/General/Beforefieldinit.aspx aborda esta pregunta 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 la creación de una instancia o el propio método / propiedad estática de la clase.
Tenga en cuenta que los iniciadores estáticos (si no hay un constructor estático) se garantiza que se ejecutarán en cualquier momento antes de la primera referencia a un campo en particular.
fuente
El constructor estático se llama antes de usar cualquier cosa en la clase, pero exactamente cuándo sucede eso 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 la clase nunca se usa, no se garantiza que se llame al constructor estático.
fuente
En caso de que se llame al método estático desde la clase principal, no se llamará al constructor estático, aunque se especifique explícitamente. Aquí hay un ejemplo de que no se llama al constructor b 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 } }
fuente
Parece haber un problema con los constructores estáticos que se responde en otro lugar, pero tomó un tiempo para digerir en una explicación simple. Todos los documentos y explicaciones afirman que el constructor estático / inicializadores está "garantizado" para ejecutarse antes de que se cree una instancia de la primera clase o se haga referencia al primer campo estático. El problema aparece cuando intentas poner un singleton estático en la clase que crea una instancia de sí mismo (gallina / huevo). En este caso, el constructor estático termina siendo llamado después del constructor de instancia, y en mi caso, el constructor de instancia contenía código que se basaba en algunos datos estáticos.
¿Se llama al constructor estático después del constructor de instancia?
El constructor estático puede ejecutarse después del constructor no estático. ¿Es esto un error del compilador?
(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 sea necesario)
fuente