c# - ¿Constructor estático llamado después de constructor de instancia?
static (1)
Los inicializadores en línea para campos static
ejecutan antes que el constructor static
explícito.
El compilador transforma tu clase en algo como esto:
public class Test {
.cctor { //Class constructor
Test.test = new Test(); //Inline field initializer
Console.WriteLine("static Test()"); //Explicit static ctor
}
.ctor { ... } //Instance constructor
}
Tenga en cuenta que esto es independiente de la orden de declaración.
Para citar la spec :
Los inicializadores de variable de campo estático de una clase corresponden a una secuencia de asignaciones que se ejecutan en el orden textual en el que aparecen en la declaración de clase. Si existe un constructor estático (Sección 10.11) en la clase, la ejecución de los inicializadores de campo estático ocurre inmediatamente antes de ejecutar ese constructor estático.
Queridos todos, la pregunta como esta ya se ha formulado , pero entre las respuestas no hubo una explicación del problema que veo.
El problema: la Guía de programación de C # dice:
Se utiliza un constructor estático para inicializar cualquier dato estático, o para realizar una acción particular que solo necesita ejecutarse una vez. Se llama automáticamente antes de que se cree la primera instancia o se haga referencia a cualquier miembro estático.
En particular, se llama al constructor estático antes de que se cree cualquier instancia de una clase. (Esto no garantiza que el constructor estático finalice antes de la creación de la instancia, pero esta es una historia diferente).
Consideremos el código de ejemplo:
using System;
public class Test
{
static public Test test = new Test();
static Test()
{
Console.WriteLine("static Test()");
}
public Test()
{
Console.WriteLine("new Test()");
}
}
public class Program
{
public static void Main()
{
Console.WriteLine("Main() started");
Console.WriteLine("Test.test = " + Test.test);
Console.WriteLine("Main() finished");
}
}
Produce:
Main () comenzó
nueva prueba ()
Prueba estática ()
Test.test = Prueba
Principal () terminado
Así que podemos ver que el constructor de la instancia finaliza (y, por lo tanto, se crea una instancia) antes de que se inicie el constructor estático. ¿No contradice esto a la Guía? ¿Tal vez la inicialización de campos estáticos se considera una parte implícita del constructor estático?