W Visual Basic struktury definiowane są za pomocą słowa kluczowego Structure. Są one:
MustInherit (abstrakcyjne) ani zawierać finalizatorów;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 ' Wartość jest kopiowana, nie odniesienie! p2.X = 5 ' p1.X = 1, p2.X = 5
P: Jak zachowuje się struktura przy przekazywaniu do funkcji ByVal i ByRef? Czym różni się to od przekazywania klasy?
O: Przy przekazywaniu struktury ByVal tworzona jest kopia całej struktury. Zmiany w funkcji nie dotyczą oryginału. Przy ByRef — zmieniana jest oryginalna zmienna. W odróżnieniu od klas, które przy każdej transakcji (nawet ByVal) przekazują odniesienie, struktury przy ByVal są w pełni kopiowane, co wpływa na wydajność i zachowanie.
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 wciąż 3 MutateByRef(s) ' s.X teraz 100
Historia
1. W dużym projekcie bibliotecznym struktury były używane do przesyłania dużych zestawów danych przez interfejsy ByVal. Doprowadziło to do spadku wydajności z powodu wielokrotnego kopiowania dużych struktur na stosie. Problem rozwiązano, zastępując struktury niemutowalnymi klasami.
Historia
2. W projekcie GIS pojawiło się zamieszanie przy kopiowaniu struktur zawierających pola referencyjne — zmieniając tablicę wewnątrz struktury, programista nie spodziewał się, że oryginał zmieni się wszędzie, gdzie skopiowano tablicę, mimo że to „typ wartości”.
Historia
**3. W oprogramowaniu księgowym mieszano struktury z klasami dla byty biznesowe: próba wdrożenia dziedziczenia dla struktury zakończyła się błędem kompilacji, trzeba było zreorganizować architekturę systemu, co okazało się czasochłonne z powodu pierwotnie błędnego wyboru między strukturami a klasami.