20 votes

Pourquoi les champs non statiques ne peuvent-ils pas être initialisés dans les structures ?

Considérons ce bloc de code :

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

    // initialize the non-static field here
    public void FuncToInitializeName()
    {
        name = ""; // Now correct
    }
}
  • Pourquoi pouvons-nous initialiser un static à l'intérieur d'une structure mais pas d'un non-static champ ?
  • Pourquoi devons-nous initialiser non-static dans les corps de méthodes ?

7voto

astander Points 83138

1voto

supercat Points 25534

L'ITC s'attend à pouvoir allouer et créer de nouvelles instances de tout type de valeur qui nécessiterait "n" octets de mémoire, en allouant simplement "n" octets et en les remplissant de zéro. Il n'y a aucune raison pour que l'ITC ne puisse pas fournir un moyen de spécifier qu'avant qu'une entité contenant des structures ne soit mise à la disposition du code extérieur, un constructeur doit être exécuté sur chaque structure qu'elle contient, ou qu'à chaque fois qu'une instance d'une structure particulière de n octets est créée, le compilateur doit copier une "instance de modèle". En l'état, cependant, l'interface de programmation ne permet pas une telle chose. Par conséquent, il n'y a aucune raison pour qu'un compilateur prétende avoir un moyen de s'assurer que les structures seront initialisées à autre chose que la valeur par défaut remplie de mémoire avec des zéros.

0voto

Mehrdad Afshari Points 204872

Il n'est pas possible d'écrire un constructeur par défaut personnalisé dans une structure. Les initialisateurs des champs d'instance devront éventuellement être déplacés vers le constructeur que vous ne pouvez pas définir.

Les initialisateurs de champs statiques sont déplacés vers un constructeur statique. Vous peut écrire un constructeur statique personnalisé dans une structure.

-1voto

amphetamachine Points 7384

Une structure n'est pas un objet réel, mais une déclaration d'un type d'objet. C'est du moins ce qui se passe en C-régulier.

-1voto

Daniel Earwicker Points 63298

Vous peut faire exactement ce que vous essayez de faire. Tout ce qui vous manque, c'est un constructeur personnalisé qui appelle le constructeur par défaut :

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

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

Le constructeur doit prendre au moins un paramètre, puis il doit transmettre à this() pour initialiser les membres.

La raison pour laquelle cela fonctionne est que le compilateur dispose désormais d'un moyen de découvrir les moments où le code doit être exécuté pour initialiser le name champ : chaque fois que vous écrivez new Animal(someBool) .

Avec n'importe quelle structure, vous pouvez dire new Animal() Mais des animaux "vierges" peuvent être créés implicitement dans de nombreuses circonstances dans le fonctionnement du CLR, et il n'y a pas de moyen de s'assurer que le code personnalisé est exécuté à chaque fois que cela se produit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X