ProgrammierungVB.NET Entwickler, Architekt

Beschreiben Sie die Eigenschaften und die richtige Verwendung von Strukturen (Structure) in Visual Basic im Vergleich zu Klassen (Class). Welche Einschränkungen bestehen bei deren Anwendung und wie unterscheiden sie sich von Klassen hinsichtlich Speichermanagement und Verhalten?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

In Visual Basic werden Strukturen mit dem Schlüsselwort Structure definiert. Sie sind:

  • Werttypen (value type): Sie werden im Stack oder innerhalb anderer Objekte gespeichert;
  • Unterstützen keine Vererbung von anderen benutzerdefinierten Typen (können aber Schnittstellen implementieren);
  • Dürfen keinen Parameterlosen Konstruktor haben, außer dem standardmäßigen Konstruktor außerhalb des Strukturkörpers;
  • Dürfen nicht als MustInherit (abstrakt) deklariert werden oder Finalizer enthalten;
  • Sind eine gute Wahl für kleine, unveränderliche Objekte, die Speicher im Heap sparen.

Beispiel

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

Einschränkungen

  • Strukturen können nicht von anderen Strukturen erben, nur von System.ValueType.
  • Nur ein automatischer parameterloser Konstruktor ist zulässig.
  • Nur Schnittstellen sind zur Implementierung zulässig.
  • Wenn die Struktur referenzielle Mitglieder enthält, ist Vorsicht geboten aufgrund möglicher Kopier- und Mutationsnuancen.

Fangfrage

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.