recorrer enum ejemplos dotnetperls array c# .net field struct

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 campo non-static ?
  • ¿Por qué tenemos que inicializar non-static en cuerpos de métodos?


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.