ProgrammationDéveloppeur VB/VB.NET

Comment implémenter des types de données définis par l'utilisateur (User-Defined Types, UDT) dans Visual Basic, et dans quels cas devraient-ils être utilisés à la place des classes ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Dans Visual Basic, les types de données définis par l'utilisateur (Type dans VB6 ou Structure dans VB.NET) permettent de définir vos propres types composites comprenant plusieurs variables de types différents. C'est pratique pour regrouper des données connexes.

UDT (VB6):

Type Person Name As String Age As Integer Height As Single End Type Dim employee As Person employee.Name = "Alexey" employee.Age = 32 employee.Height = 1.85

Structures (VB.NET):

Structure Person Public Name As String Public Age As Integer Public Height As Single End Structure Dim employee As Person employee.Name = "Alexey"

Quand utiliser :

  • Pour des conteneurs de données légers sans logique
  • Lorsque la performance est importante (les structures sont créées sur la pile)
  • Si l'héritage n'est pas nécessaire - les structures ne supportent pas l'héritage

À l'opposé : Les classes sont utilisées lorsque l'encapsulation de la logique, l'héritage, le polymorphisme ou la mise en œuvre d'interfaces sont nécessaires.

Question piège

Pourquoi les structures dans VB.NET ne peuvent-elles pas être assignées à Nothing ?

Réponse : Seules les variables de classe (objets) peuvent être assignées à Nothing, car elles stockent des références. Les structures sont des types valeur, elles contiennent toujours un ensemble de valeurs ; tenter d'assigner Nothing entraînera une erreur de compilation.

Dim s As Person = Nothing 'Erreur! Les structures ne peuvent pas être Nothing (sauf Nullable(Of T))

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


Histoire

Dans un ancien projet, il a été décidé de remplacer un tableau de primitives par une structure avec plusieurs champs, mais le nouveau code est devenu soudainement plus lent. Il s'est avéré que la structure était très volumineuse et était souvent copiée dans des fonctions. Si une classe avait été utilisée, seule la référence aurait été copiée, et non la structure entière.


Histoire

Après le portage de UDT de VB6 à VB.NET, un des développeurs n'a pas implémenté l'interface ISerializable pour la structure dans l'appel distant. En conséquence, l'objet distant ne pouvait pas être sérialisé, ce qui a provoqué des échecs lors de l'interaction inter-processus.


Histoire

Dans un module de traitement de la géométrie, la structure contenait des références à des tableaux (mutables). Plusieurs instances de cette structure ont conduit à des effets inattendus, car les références à l'intérieur de la structure pointaient vers les mêmes tableaux de données - les mutations se réflectaient sur toutes les copies !