ProgrammationDéveloppeur VB.NET, Architecte

Décrivez les caractéristiques et l'utilisation correcte des structures (Structure) dans Visual Basic par rapport aux classes (Class). Quelles restrictions existent lors de leur utilisation et comment diffèrent-elles des classes en termes de gestion de la mémoire et de comportement ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Dans Visual Basic, les structures sont définies à l'aide du mot clé Structure. Elles :

  • Sont des types valeur (value type) : elles sont placées sur la pile ou à l'intérieur d'autres objets ;
  • Ne prennent pas en charge l'héritage d'autres types personnalisés (mais peuvent implémenter des interfaces) ;
  • Ne peuvent pas avoir de constructeur sans paramètres, sauf le constructeur par défaut en dehors du corps de la structure ;
  • Ne peuvent pas être déclarées comme MustInherit (abstrait) ni contenir de finaliseurs ;
  • Sont un bon choix pour de petits objets immuables, économisant la mémoire sur le tas.

Exemple

Public Structure Point Public X As Integer Public Y As Integer Public Sub New(x As Integer, y As Integer) Me.X = x Me.Y = y End Sub End Structure Dim p1 As New Point(1, 2) Dim p2 = p1 ' Copie la valeur, pas la référence ! p2.X = 5 ' p1.X = 1, p2.X = 5

Restrictions

  • Les structures ne peuvent pas hériter les unes des autres, seulement de System.ValueType.
  • Seulement un constructeur automatique sans paramètres.
  • Seules des interfaces sont autorisées pour l'implémentation.
  • Si la structure contient des membres de référence, il convient d'être prudent en raison des nuances possibles de copie et de mutation.

Question piège

Q : Comment se comporte une structure lorsqu'elle est transmise à une fonction ByVal et ByRef ? Quelle est la différence par rapport à la transmission d'une classe ?

R : Lors de la transmission d'une structure ByVal, une copie de la structure entière est créée. Les modifications dans la fonction n'affectent pas l'original. Avec ByRef, la variable d'origine est modifiée. Contrairement aux classes, qui, lors de n'importe quelle transmission (même ByVal), transmettent une référence, les structures sont entièrement copiées en ByVal, ce qui influence les performances et le comportement.

Sub MutateByVal(p As Point) p.X = 100 End Sub Sub MutateByRef(ByRef p As Point) p.X = 100 End Sub Dim s As New Point(3, 4) MutateByVal(s) ' s.X est toujours 3 MutateByRef(s) ' s.X est maintenant 100

Histoire

1. Dans un grand projet de bibliothèque, des structures ont été utilisées pour transmettre de grands tableaux de données via des interfaces ByVal. Cela a entraîné une baisse de performance en raison de la multiplication des copies de grandes structures sur la pile. Le problème a été résolu en remplaçant les structures par des classes immuables.


Histoire

2. Lors d'un projet de développement GIS, une confusion est survenue lors de la copie de structures contenant des champs de référence — en modifiant un tableau à l'intérieur de la structure, le développeur ne s'attendait pas à ce que l'original change partout où le tableau avait été copié, malgré le “type valeur”.


Histoire

**3. Dans un logiciel de comptabilité, des structures étaient mélangées avec des classes pour des entités métier : une tentative de réaliser l'héritage pour une structure a conduit à une erreur de compilation, il a fallu réorganiser l'architecture du système, ce qui s'est avéré coûteux en raison d'un choix initial incorrect entre structures et classes.