¿C# resuelve las dependencias entre los miembros de datos estáticos automáticamente?

StackOverflow https://stackoverflow.com/questions/1727301

  •  19-09-2019
  •  | 
  •  

Pregunta

Si un miembro de datos estáticos depende de otro miembro de datos estáticos, ¿C#/. Net garantiza que el miembro estático dependiente se inicialice antes del miembro dependiente?

Por ejemplo, tenemos una clase como:

class Foo
{
    public static string a = "abc";

    public static string b = Foo.a + "def";
}

Cuando Foo.b se accede, ¿siempre es "abcdef" o puede ser "def"?

Si esto no está garantizado, ¿hay alguna mejor manera de asegurarse de que el miembro dependiente inicializado primero?

¿Fue útil?

Solución

Como dijo antes, la inicialización del campo estático es determinista y va de acuerdo con el orden de la declaración textual.

Tome esto, por ejemplo:

class Foo
{
    public static string b = a + "def";
    public static string a = "abc";
}

Foo.b siempre dará como resultado "def".

Para el caso, cuando hay una dependencia entre los campos estáticos, es mejor usar un inicializador estático:

class Foo
{
    public static string b;
    public static string a;

    static Foo()
    {
        a = "abc";
        b = a + "def";
    }
}

De esa manera, expresa explícitamente su preocupación por el orden de inicialización; o dependencia para el caso (incluso si el compilador no ayuda si cambia accidentalmente las declaraciones de inicialización). Los anteriores tendrán los valores esperados almacenados en A y B (respectivamente "ABC" y "ABCDEF").

Sin embargo, las cosas pueden volverse sinuosas (e implementación específicas) para la inicialización de campos estáticos definidos en múltiples clases. La sección 10.4.5.1 Inicialización del campo estático de la especificación del idioma habla un poco más.

Otros consejos

Mostrará siempre "ABCDEF", porque la inicialización va en la fuente, hoy como antes.

Todos los miembros estáticos se inicializarán al cargar el Classtype que los mantiene.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top