Orden de Inicialización de los campos Estáticos en la Clase Estática


Dado el siguiente código:

public static class Helpers
{
   private static Char[] myChars = new Char[] {'a', 'b'};

   private static Int32 myCharsSize = myChars.Length;
}

¿Se garantiza que myChars se inicializará antes de Que use su longitud para asignar a myCharsSize?

Author: Falko, 2009-09-30

3 answers

Sí, lo harán, consulte 10.4.5.1 Inicialización de campos estáticos :

Inicializadores de la 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 una estática constructor (Sección 10.11) existe en la clase, ejecución de la estática inicializadores de campo ocurre inmediatamente antes de ejecutar esa estática constructor. De lo contrario, el estática inicializadores de campo se ejecutan en un tiempo dependiente de la implementación antes de el primer uso de un campo estático de esa clase.

Dicho esto, creo que sería mejor hacer la inicialización dentro de un inicializador de tipo estático (constructor estático).

 44
Author: Andrew Hare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-29 20:27:31

Hmm... Me sorprende que compile (lo hace, lo comprobé). No estoy al tanto de ninguna garantía que lo haga seguro. Utilice un constructor estático...


Editar: Acepto (ver mejor respuesta arriba) que funcionará; pero mi idea con el código es mantenerlo tan simple y obvio como sea posible. Si no es obvio que funcionará (y no puede ser si tienes que preguntar), entonces no lo escribas de esa manera...

En particular, los problemas con la confianza en el campo orden:

  • puede romperse si mueve el código (lo que hago a menudo)
  • puede romperse si divide el código en partial clases

Mi consejo sigue siendo: use un constructor estático para este escenario.

 13
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:10

A primera vista, no estaría seguro, y tuve que probar esto para ver si incluso compilado.

Dado eso, inicializaría el valor en un constructor estático.

 0
Author: Jon Seigel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-29 20:29:21