2010-02-21 10 views
20

consideran este bloque de código:¿Por qué no se pueden inicializar campos no estáticos dentro de las estructuras?

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?
+1

¿Cada instancia de Animal va a pesar 20 unidades y no tiene nombre? Tal vez estás buscando un constructor. (Perdón por mi terminología si eso es incorrecto.) – GManNickG

+2

Es solo un código de muestra. –

Respuesta

0

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. Usted puede escribir un constructor estático personalizado en una estructura.

-1

Usted puede hacer exactamente lo que estamos tratando. Todo lo que se está perdiendo es un constructor personalizado que llama al constructor por defecto:

struct Animal 
{ 
    public string name = ""; 
    public static int weight = 20; 

    public Animal(bool someArg) : this() { } 
} 

El constructor tiene que tener al menos un parámetro, y luego tiene que remitir a this() para obtener los miembros inicializado.

La razón por la que esto funciona es porque el compilador ahora tiene una manera de descubrir los tiempos cuando el código debería ejecutarse para inicializar el campo name: siempre 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 una forma de garantizar que se ejecute código personalizado cada vez que eso sucede.

+0

Esta estructura ganó 'compilar' no puede tener inicializadores de campo de instancia en las estructuras ' –

1

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.

Cuestiones relacionadas