class / struct

Références

L'actualité

Librairie

L'information

struct

Les structs sont définis à l'aide du mot clé struct, par exemple :

Les structs partagent quasiment la même syntaxe que les classes. Le nom du struct doit être un nom d'identificateur C# valide. Les structs sont plus limités que les classes des manières suivantes :

  • Au sein d'une déclaration de struct, les champs ne peuvent pas être initialisés à moins d'être déclarés comme étant de type const ou static.
  • Un struct ne peut pas déclarer de constructeur par défaut (un constructeur sans paramètre) ni de finaliseur.
  • Les structs sont copiés lors de l'assignation. Lorsqu'un struct est assigné à une nouvelle variable, toutes les données sont copiées et les modifications apportées à la nouvelle copie ne changent pas les données de la copie d'origine. Il est important de vous en souvenir quand vous utilisez des collections de types valeur telles que Dictionary‹string, myStruct›.
  • Les structs sont des types valeur, contrairement aux classes, qui sont des types référence.
  • Contrairement aux classes, il est possible d'instancier les structs sans avoir recours à un opérateur new.
  • Les structs peuvent déclarer des constructeurs qui ont des paramètres.
  • Un struct ne peut pas hériter d'un autre struct ou d'une classe; il ne peut pas non plus servir de base à une classe. Tous les structs héritent directement de ValueType, qui hérite de Object.
  • Un struct peut implémenter des interfaces.
  • Un struct ne peut pas être null, et une variable de struct ne peut pas se voir assigner null, sauf si elle est déclarée en tant que type nullable.

Utilisation de structs

Le type struct est approprié pour représenter des objets légers tels que Point, Rectangle et Color. Bien qu'il soit aussi pratique de représenter un point comme classe avec des propriétés implémentées automatiquement, un struct peut être plus efficace dans certains scénarios. Par exemple, si vous déclarez un tableau de 1 000 objets Point, vous devez allouer de la mémoire supplémentaire pour faire référence à chacun des objets. Dans ce cas, un struct est moins onéreux. étant donné que le .NET Framework contient un objet nommé Point, le struct dans cet exemple est nommé à la place "Coords".

Définir un constructeur par défaut (sans paramètre) pour un struct constitue une erreur. Vous ne devez pas non plus initialiser un champ d'instance dans le corps d'un struct. Vous pouvez initialiser des membres de struct accessibles en externe seulement en utilisant un constructeur paramétrable, le constructeur par défaut implicite ou un initialiseur d'objet, ou en accédant individuellement aux membres après la déclaration du struct. Tout membre privé ou inaccessible nécessite exclusivement l'utilisation de constructeurs.

Quand vous créez un objet struct avec l'opérateur new, cet objet est créé et le constructeur approprié est appelé conformément à la signature du constructeur. Contrairement aux classes, les structs peuvent être instanciés sans avoir recours à l'opérateur new . Dans un tel cas, il n'y a pas d'appel au constructeur, ce qui rend l'allocation plus efficace. Toutefois, les champs ne sont pas assignés et l'objet ne peut pas être utilisé tant que tous les champs ne sont pas initialisés. Ceci inclut l'incapacité à obtenir ou à définir des valeurs via des propriétés implémentées automatiquement.

Si vous instanciez un objet struct avec le constructeur sans paramètre (la façon de l'instancier par défaut), tous les membres sont affectés en fonction de leur valeur par défaut.

Quand vous écrivez un constructeur avec des paramètres pour un struct, vous devez explicitement initialiser tous les membres ; sinon, un ou plusieurs membres restent non affectés et le struct ne peut pas être utilisé, produisant l'erreur du compilateur CS0171.

Il n'existe pas d'héritage pour un struct comme il en existe pour une classe. Un struct ne peut pas hériter d'un autre struct ou d'une classe ; il ne peut pas non plus servir de base à une classe. Toutefois, les structs héritent de la classe de base Object. Un struct peut implémenter des interfaces exactement de la même manière que les classes.

Vous ne pouvez pas déclarer une classe à l'aide du mot clé struct. En C#, les classes et les structs ont une sémantique différente. Un struct est un type valeur, alors qu'une classe est un type référence.

Sauf si vous avez besoin d'une sémantique de type référence, une petite classe peut être gérée plus efficacement par le système si vous la déclarez plutôt sous forme de struct.

Exemple

Cet exemple illustre l'initialisation du type struct à l'aide des constructeurs par défaut et des constructeurs paramétrables.


Cet exemple montre une caractéristique propre aux structs. Il crée un objet Coords sans utiliser l'opérateur new. Si vous remplacez le mot struct par le mot class, le programme ne peut pas se compiler.