que he hecho un poco de búsqueda y creo que el siguiente código está garantizado para producir una salida:¿El orden de inicialización de clase estática en C# es determinista?
BX = 7
BX = 0
AX = 1
A = 1, B = 0
static class B
{
public static int X = 7;
static B() {
Console.WriteLine("B.X = " + X);
X = A.X;
Console.WriteLine("B.X = " + X);
}
}
static class A
{
public static int X = B.X + 1;
static A() {
Console.WriteLine("A.X = " + X);
}
}
static class Program
{
static void Main() {
Console.WriteLine("A = {0}, B = {1}", A.X, B.X);
}
}
He corrido esto varias veces y siempre obtengo el resultado por encima de la sección del código; Solo quería verificar que nunca cambiara? Incluso si textualmente, la clase A y la clase B se reorganizan?
¿Está garantizado que el primer uso de un objeto estático desencadenará la inicialización de sus miembros estáticos, seguido de la creación de instancias de su constructor estático? Para este programa, el uso de A.X en main activará la inicialización de A.X, que a su vez inicializa B.X, luego B() y luego de finalizar la inicialización de A.X, pasará a A(). Finalmente Main() generará A.X y B.X.
Si Principal() había utilizado BX primero, a continuación, los valores de salida serían 7, 8, 8, A = 8, B = 8. – Jess
Para el código específico dado en su pregunta, entonces la respuesta de Porges es correcta en el dinero. Para la pregunta más general de su título: * "¿Es determinístico el orden de inicialización de clases estáticas en C#?" *, La respuesta es que depende: si los tipos estáticos implicados tienen constructores estáticos, el orden de inicialización * es * determinista ; si no lo hacen, entonces no lo es. – LukeH
Relacionado: http://stackoverflow.com/questions/1494735/initialization-order-of-static-fields-in-static-class –