Dans Visual Basic, les structures sont définies à l'aide du mot clé Structure. Elles :
MustInherit (abstrait) ni contenir de finaliseurs ;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
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.