In Visual Basic werden Strukturen mit dem Schlüsselwort Structure definiert. Sie sind:
MustInherit (abstrakt) deklariert werden oder Finalizer enthalten;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 ' Wert wird kopiert, kein Verweis! p2.X = 5 ' p1.X = 1, p2.X = 5
F: Wie verhält sich eine Struktur bei der Übergabe an eine Funktion ByVal und ByRef? Was ist der Unterschied zur Übergabe einer Klasse?
A: Bei der Übergabe einer Struktur mit ByVal wird eine Kopie der gesamten Struktur erstellt. Veränderungen in der Funktion betreffen das Original nicht. Bei ByRef wird die ursprüngliche Variable geändert. Im Gegensatz zu Klassen, die bei jeder Übergabe (auch ByVal) einen Verweis übergeben, werden Strukturen bei ByVal vollständig kopiert, was sich auf die Leistung und das Verhalten auswirkt.
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 ist weiterhin 3 MutateByRef(s) ' s.X ist jetzt 100
Geschichte
1. In einem großen Bibliotheksprojekt wurden Strukturen verwendet, um große Datensätze über Interfaces ByVal zu übergeben. Dies führte zu einer Verringerung der Leistung durch mehrfaches Kopieren großer Strukturen im Stack. Das Problem wurde gelöst, indem Strukturen durch unveränderliche Klassen ersetzt wurden.
Geschichte
2. Bei einem GIS-Entwicklungsprojekt entstand Verwirrung beim Kopieren von Strukturen, die Referenzfelder enthielten – bei der Änderung des Arrays innerhalb der Struktur erwartete der Entwickler nicht, dass sich das Original überall verändert, wo das Array kopiert wurde, trotz des „Werttyps“.
Geschichte
3. In einer Buchhaltungssoftware wurden Strukturen mit Klassen für Geschäftseinheiten gemischt: Der Versuch, Vererbung für eine Struktur zu implementieren, endete mit einem Kompilierungsfehler, was zu einer Umorganisation der Systemarchitektur führte, was sich als aufwendig herausstellte aufgrund der anfangs falschen Wahl zwischen Strukturen und Klassen.