enum - recorrer struct c#
¿Por qué no se pueden inicializar campos no estáticos dentro de las estructuras? (4)
Considera este bloque de código:
struct Animal
{
public string name = ""; // Error
public static int weight = 20; // OK
// initialize the non-static field here
public void FuncToInitializeName()
{
name = ""; // Now correct
}
}
- ¿Por qué podemos inicializar un campo
static
dentro de una estructura pero no un camponon-static
? - ¿Por qué tenemos que inicializar
non-static
en cuerpos de métodos?
Echa un vistazo a ¿Por qué los tipos de valor no tienen constructores predeterminados?
La CLI espera poder asignar y crear nuevas instancias de cualquier tipo de valor que requiera ''n'' bytes de memoria, simplemente asignando ''n'' bytes y llenándolos con cero. No hay ninguna razón para que la CLI "no pueda" proporcionar un medio para especificar que antes de que cualquier entidad que contenga estructuras esté disponible para el código externo, un constructor debe ejecutarse en cada estructura, o que siempre que una instancia de una n particular se crea byte struct, el compilador debe copiar una ''instancia de plantilla''. Como es, sin embargo, la CLI no permite tal cosa. En consecuencia, no hay ninguna razón para que un compilador pretenda que tiene un medio de asegurar que las estructuras se inicializarán a algo distinto al predeterminado de memoria llena de ceros.
No puede escribir un constructor predeterminado personalizado en una estructura. Los inicializadores del campo de instancia eventualmente necesitarán moverse al constructor que no puede definir.
Los inicializadores de campo estáticos se mueven a un constructor estático. Puede escribir un constructor estático personalizado en una estructura.
Puedes hacer exactamente lo que estás intentando. Lo único que te falta es un constructor personalizado que llame al constructor predeterminado:
struct Animal
{
public string name = "";
public static int weight = 20;
public Animal(bool someArg) : this() { }
}
El constructor debe tomar al menos un parámetro y luego debe reenviar a this()
para inicializar los miembros.
La razón por la que esto funciona es porque el compilador ahora tiene una manera de descubrir los tiempos en los que el código debería ejecutarse para inicializar el campo de name
: cada vez que escriba new Animal(someBool)
.
Con cualquier estructura, puede decir new Animal()
, pero los animales "vacíos" pueden crearse implícitamente en muchas circunstancias en el funcionamiento de la CLR, y no hay forma de garantizar que se ejecute código personalizado cada vez que eso sucede.