ProgrammierungVB/VB.NET Entwickler

Wie implementiert man benutzerdefinierte Datentypen (User-Defined Types, UDTs) in Visual Basic, und in welchen Fällen sollte man sie anstelle von Klassen verwenden?

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

Antwort

In Visual Basic ermöglichen benutzerdefinierte Datentypen (Type in VB6 oder Structure in VB.NET) die Definition eigener zusammengesetzter Typen, die mehrere Variablen unterschiedlicher Typen enthalten. Dies ist praktisch zur Bündelung verwandter Daten.

UDTs (VB6):

Type Person Name As String Age As Integer Height As Single End Type Dim employee As Person employee.Name = "Alexei" employee.Age = 32 employee.Height = 1.85

Strukturen (VB.NET):

Structure Person Public Name As String Public Age As Integer Public Height As Single End Structure Dim employee As Person employee.Name = "Alexei"

Wann verwenden:

  • Für leichte Datenträger ohne Logik
  • Wenn Leistung wichtig ist (Strukturen werden im Stack erstellt)
  • Wenn keine vererbbaren Funktionen benötigt werden — Strukturen unterstützen keine Vererbung

Im Gegensatz dazu: Klassen werden verwendet, wenn Kapselung von Logik, Vererbung, Polymorphismus oder Implementierung von Schnittstellen erforderlich sind.

Fangfrage

Warum können Strukturen in VB.NET keinen Wert Nothing zugewiesen bekommen?

Antwort: Nur Klassenvariablen (Objekte) können Nothing zugewiesen werden, da sie Referenzen speichern. Strukturen sind value-type; sie enthalten immer einen Satz von Werten; der Versuch, Nothing zuzuweisen, führt zu einem Kompilierungsfehler.

Dim s As Person = Nothing 'Fehler! Strukturen können nicht Nothing sein (außer Nullable(Of T))

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


Geschichte

In einem alten Projekt beschloss man, ein Array von primitiven Typen durch eine Struktur mit mehreren Feldern zu ersetzen, aber der neue Code wurde unerwartet langsamer. Es stellte sich heraus: Die Struktur war sehr groß und wurde häufig in Funktionen kopiert. Wenn man eine Klasse verwendet hätte, wären nur die Referenzen und nicht die gesamte Struktur kopiert worden.


Geschichte

Nach der Portierung von VB6-UDT zu VB.NET implementierte einer der Entwickler das Interface ISerializable für die Struktur im Remote Call nicht. Infolgedessen konnte das entfernte Objekt nicht serialisiert werden, was zu Fehlern bei der interprozessualen Kommunikation führte.


Geschichte

In einem Modul zur Arbeit mit Geometrie speicherte die Struktur Referenzen auf Arrays (mutable). Mehrere Instanzen dieser Struktur führten zu unerwarteten Effekten, da die Referenzen innerhalb der Struktur auf dieselben Datensätze verwiesen — Mutationen spiegelten sich in allen Kopien wider!