Structures et classes (Visual Basic)

Visual Basic unifie la syntaxe des structures et des classes, de sorte que les deux entités prennent en charge la plupart des mêmes fonctionnalités. Toutefois, il existe également des différences importantes entre les structures et les classes.

Les classes ont l'avantage d'être des types de référence - passer une référence est plus efficace que de passer une variable de structure avec toutes ses données. En revanche, les structures ne nécessitent pas d’allocation de mémoire sur le tas global.

Étant donné que vous ne pouvez pas hériter d’une structure, les structures doivent être utilisées uniquement pour les objets qui n’ont pas besoin d’être étendus. Utilisez des structures lorsque l’objet que vous souhaitez créer a une petite taille de instance et prenez en compte les caractéristiques de performances des classes par rapport aux structures.

Similitudes

Les structures et les classes sont similaires dans les points suivants :

  • Les deux sont des types de conteneurs, ce qui signifie qu’ils contiennent d’autres types en tant que membres.

  • Les deux ont des membres, qui peuvent être des constructeurs, des méthodes, des propriétés, des champs, des constantes, des énumérations, des événements et des gestionnaires d'événements.

  • Les membres des deux groupes peuvent avoir des niveaux d'accès individualisés. Par exemple, un membre peut être déclaré Public et un autre Private.

  • Tous deux peuvent mettre en œuvre des interfaces.

  • Les deux peuvent avoir des constructeurs partagés, avec ou sans paramètres.

  • Les deux peuvent exposer une propriété par défaut, à condition que cette propriété accepte au moins un paramètre.

  • Les deux peuvent déclarer et déclencher des événements, et les deux peuvent déclarer des délégués.

Différences

Les structures et les classes diffèrent dans les détails suivants :

  • Les structures sont des types de valeurs ; les classes sont des types de références. Une variable d’un type de structure contient les données de la structure, au lieu de contenir une référence aux données comme le fait un type de classe.

  • Les structures utilisent l’allocation de pile ; les classes utilisent l’allocation de tas.

  • Tous les éléments de structure sont Public par défaut ; les variables et constantes de classe sont Private par défaut, tandis que les autres membres de la classe sont Public par défaut. Ce comportement pour les membres de classe assure la compatibilité avec le système visual Basic 6.0 par défaut.

  • Une structure doit avoir au moins un élément d’événement non partagé ou non partagé ; une classe peut être complètement vide.

  • Les éléments de structure ne peuvent pas être déclarés comme Protected; les membres d'une classe peuvent.

  • Une procédure de structure peut gérer des événements uniquement s’il s’agit d’une procédure partagéeSub, et uniquement au moyen de l’instruction AddHandler ; toute procédure de classe peut gérer des événements, à l'aide du mot-clé Handles ou de l'instruction AddHandler. Pour plus d’informations, consultez Événements.

  • Les déclarations de variable de structure ne peuvent pas spécifier d’initialiseurs ou de tailles initiales pour les tableaux ; les déclarations de variable de classe peuvent.

  • Les structures héritent implicitement de la classe System.ValueType et ne peuvent pas hériter d’un autre type ; les classes peuvent hériter d’une ou plusieurs classes autres que System.ValueType.

  • Les structures ne peuvent pas être héritées ; les classes oui.

  • Les structures ne sont jamais terminées, de sorte que le Common Language Runtime (CLR) n'appelle jamais la méthode Finalize sur une structure ; les classes sont terminées par le récupérateur de mémoire, qui appelle Finalize d’une classe lorsqu'il détecte qu'il n'y a plus de références actives restantes.

  • Une structure ne nécessite pas de constructeur ; c’est le cas d’une classe .

  • Les structures peuvent avoir des constructeurs non partagés uniquement si elles prennent des paramètres ; les classes peuvent les avoir avec ou sans paramètres.

Chaque structure a un constructeur public implicite sans paramètres. Ce constructeur initialise tous les éléments de données de la structure à leurs valeurs par défaut. Vous ne pouvez pas redéfinir ce comportement.

Instances et variables

Étant donné que les structures sont des types valeur, chaque variable de structure est liée de manière permanente à une structure individuelle instance. Toutefois, les classes sont des types référence et une variable objet peut faire référence à différentes instances de classe à différents moments. Cette distinction affecte votre utilisation des structures et des classes des manières suivantes :

  • Initialisation. Une variable de structure inclut implicitement une initialisation des éléments à l’aide du constructeur sans paramètre de la structure. Par conséquent, Dim s As struct1 est équivalent à Dim s As struct1 = New struct1().

  • Affectation de variables. Lorsque vous affectez une variable de structure à une autre ou transmettez une structure instance à un argument de procédure, les valeurs actuelles de tous les éléments de variable sont copiées dans la nouvelle structure. Lorsque vous affectez une variable objet à une autre ou passez une variable objet à une procédure, seul le pointeur de référence est copié.

  • Affectation de Nothing (rien). Vous pouvez affecter la valeur Nothing à une variable de structure, mais la instance continue d’être associée à la variable. Vous pouvez toujours appeler ses méthodes et accéder à ses éléments de données, bien que les éléments variables soient réinitialisés par l’affectation.

    En revanche, si vous définissez une variable objet sur Nothing, vous la dissociez de n’importe quelle classe instance et vous ne pouvez accéder à aucun membre via la variable tant que vous ne lui affectez pas un autre instance.

  • Instances multiples. Une variable objet peut se voir attribuer différentes instances de classe à différents moments, et plusieurs variables objets peuvent faire référence à la même instance de classe en même temps. Les modifications que vous apportez aux valeurs des membres de classe affectent ces membres lorsqu’ils sont accessibles via une autre variable pointant vers le même instance.

    Toutefois, les éléments de structure sont isolés dans leur propre instance. Les modifications apportées à leurs valeurs ne sont pas répercutées dans d’autres variables de structure, même dans d’autres instances de la même déclaration Structure .

  • Égalité Le test d’égalité de deux structures doit être effectué avec un test élément par élément. Deux variables d’objet peuvent être comparées à l’aide de la méthode Equals . Equalsindique si les deux variables pointent vers le même instance.

Voir aussi