In Visual Basic, le strutture sono definite utilizzando la parola chiave Structure. Esse:
MustInherit (astratte) né contenere finalizzatori;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 ' Viene copiato il valore, non il riferimento! p2.X = 5 ' p1.X = 1, p2.X = 5
D: Come si comporta la struttura quando viene passata a una funzione ByVal e ByRef? Qual è la differenza rispetto al passaggio di una classe?
R: Quando si passa una struttura ByVal, viene creata una copia dell'intera struttura. Le modifiche nella funzione non influenzano l'originale. Quando si usa ByRef, viene modificata la variabile originale. A differenza delle classi, che in qualsiasi passaggio (anche ByVal) passano un riferimento, le strutture vengono copiate completamente in ByVal, il che influisce sulle prestazioni e sul comportamento.
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 è ancora 3 MutateByRef(s) ' s.X è ora 100
Storia
1. In un grande progetto di biblioteca, le strutture venivano utilizzate per passare grandi array di dati tramite interfacce ByVal. Questo portava a una riduzione delle prestazioni a causa della copia ripetuta di grandi strutture nello stack. Il problema è stato risolto sostituendo le strutture con classi immutabili.
Storia
2. In un progetto di sviluppo GIS, si è creata confusione durante la copia di strutture contenenti campi di riferimento: modificando un array all'interno della struttura, lo sviluppatore non si aspettava che l'originale cambiasse ovunque fosse stato copiato l'array, nonostante fosse un “tipo valore”.
Storia
3. Nel software di contabilità, si mescolavano strutture con classi per entità aziendali: un tentativo di implementare l'ereditarietà per una struttura ha generato un errore di compilazione, costringendo a riorganizzare l'architettura del sistema, il che si è rivelato dispendioso a causa della scelta inizialmente errata tra strutture e classi.