2010-05-05 6 views
4

La question est sur les structures. Quand je déclare une variable de type struct/object (ne sait pas lequel correspond le mieux) ou un tableau ou une liste de structs, dois-je appeler le constructeur explicitement comme des objets ou juste déclarer suffira comme des variables?Pour les structures, dois-je appeler le constructeur explicitement en C#?

+0

Vous ne savez pas si vous demandez également si vous avez besoin de renouveler le conteneur (par exemple, la liste ), mais la réponse est oui. :) – Dave

Répondre

13

Les structures en C# peuvent être créées avec ou sans invocation d'un constructeur. Dans le cas où aucun constructeur n'est appelé, les membres du struct seront initialisés aux valeurs par défaut (essentiellement remis à zéro), et le struct ne peut pas être utilisé tant que tous ses champs ne sont pas initialisés.

De la documentation:

Lorsque vous créez un objet à l'aide struct le nouvel opérateur, il est créé et le constructeur approprié est appelé. Contrairement aux classes, les structures peuvent être instanciées sans utiliser le nouvel opérateur . Si vous n'utilisez pas new, les champs restent non affectés et l'objet ne peut pas être utilisé tant que tous les champs ne sont pas initialisés.

Voici quelques exemples:

struct Bar 
{ 
    public int Val; 

    public Bar(int v) { Val = v; } 
} 

public void Foo() 
{ 
    Bar z;  // this is legal... 
    z.Val = 5; 

    Bar q = new Bar(5); // so is this... 
    q.Val = 10; 

    // using object initialization syntax... 
    Bar w = new Bar { Val = 42; } 
} 

Les tableaux de struct sont différentes d'une seule variable struct. Lorsque vous déclarez un tableau d'un type struct vous déclarez une variable de référence - en tant que tel, vous devez allouer à l'aide de l'opérateur new:

Bar[] myBars = new Bar[10]; // member structs are initialized to defaults 

Vous pouvez également choisir d'utiliser la syntaxe d'initialisation de tableau si votre struct a un constructeur :

Bar[] moreBars = new Bar[] { new Bar(1), new Bar(2) }; 

Vous pouvez obtenir plus sophistiqué que cela. Si votre struct a un opérateur de conversion implicite d'un type primitif, vous pouvez l'initialiser comme ceci:

struct Bar 
{ 
    public int Val; 

    public Bar(int v) { Val = v; } 

    public static implicit operator Bar(int v) 
    { 
     return new Bar(v); 
    } 
} 

// array of structs initialized using user-defined implicit converions... 
Bar[] evenMoreBars = new Bar[] { 1, 2, 3, 4, 5 }; 
+0

Je suis gêné de dire que j'ai développé en C# pendant deux ans et jamais utilisé ou même rencontré le mot clé implicite! – Pierreten

0

Struct est un Value Type en C#, il utilise la mémoire pile plutôt que Heap.

Vous pouvez déclarer une variable struct de la façon régulière int a = 90; par exemple,

int est un type struct en C#.

Si vous utilisez l'opérateur new, le constructeur correspondant sera appelé.

Questions connexes