Strukturen und Klassen
Aktualisiert: November 2007
In Visual Basic wird die Syntax für Strukturen und Klassen vereinheitlicht, mit dem Ergebnis, dass Strukturen und Klassen größtenteils die gleichen Features unterstützen. Zwischen Klassen und Strukturen bestehen jedoch auch wichtige Unterschiede.
Klassen haben den Vorteil, Verweistypen zu sein — die Übergabe eines Verweises ist effizienter als die Übergabe einer Strukturvariablen mit allen zugehörigen Daten. Dagegen muss Strukturen kein Speicher des globalen Heaps zugewiesen werden.
Da nicht von einer Struktur geerbt werden kann, dürfen Strukturen nur für Objekte verwendet werden, die nicht erweitert werden müssen. Verwenden Sie Strukturen, wenn die Instanz des zu erstellenden Objekts klein ist. Ziehen Sie außerdem die Leistungsmerkmale von Klassen im Vergleich zu Strukturen in Betracht.
Ähnlichkeiten
Strukturen und Klassen sind sich in folgender Hinsicht ähnlich:
Beide sind Containertypen, d. h. sie enthalten andere Typen als Member.
Beide besitzen Member, z. B. Konstruktoren, Methoden, Eigenschaften, Felder, Konstanten, Enumerationen, Ereignisse und Ereignishandler. Diese Member dürfen jedoch nicht mit den deklarierten Elementen einer Struktur verwechselt werden.
Die Member beider Typen können individuelle Zugriffsebenen aufweisen. Beispielsweise kann ein Member als Public und ein anderer als Private deklariert sein.
Beide können Schnittstellen implementieren.
Beide können freigegebene Konstruktoren mit oder ohne Parameter besitzen.
Beide können eine Standardeigenschaft verfügbar machen, vorausgesetzt, dieser Eigenschaft wird mindestens ein Parameter übergeben.
Beide können Ereignisse deklarieren und auslösen, und beide können Delegaten deklarieren.
Unterschiede
Zwischen Strukturen und Klassen bestehen folgende Unterschiede:
Strukturen sind Werttypen. Klassen sind Verweistypen. Im Unterschied zu einer Variablen eines Klassentyps enthält eine Variable eines Strukturtyps die Daten dieser Struktur statt eines Verweises auf die Daten.
Strukturen verwenden Stapelzuweisung; Klassen verwenden Heapzuweisung.
Alle Strukturelemente sind standardmäßig Public; Klassenvariablen und Konstanten sind standardmäßig Private, während andere Klassenmember standardmäßig Public sind. Aufgrund dieses Verhaltens sind Klassenmember mit den Standardelementen des Visual Basic 6.0-Systems kompatibel.
Eine Struktur muss mindestens eine nicht freigegebene Variable oder ein nicht freigegebenes und nicht benutzerdefiniertes Ereigniselement enthalten. Eine Klasse kann völlig leer sein.
Strukturelemente können im Gegensatz zu Klassenmembern nicht als Protected deklariert werden.
Eine Strukturprozedur kann nur dann Ereignisse behandeln, wenn sie als Shared (Visual Basic)Sub-Prozedur definiert ist und die AddHandler-Anweisung-Anweisung zur Ereignisbehandlung verwendet wird. Jede Klassenprozedur kann mithilfe des Handles-Schlüsselworts oder der AddHandler-Anweisung Ereignisse behandeln. Weitere Informationen finden Sie unter Ereignisse und Ereignishandler.
In Strukturvariablendeklarationen können keine Initialisierungen oder anfängliche Arraygrößen angegeben werden, in Deklarationen von Klassenvariablen ist dies hingegen möglich.
Strukturen erben implizit von der System.ValueType-Klasse und können von keinem anderen Typ erben. Klassen können von einer beliebigen Klasse bzw. von beliebigen Klassen, ausgenommen System.ValueType, erben.
Strukturen können nicht geerbt werden, Klassen hingegen schon.
Strukturen werden nie beendet, sodass die Common Language Runtime (CLR) nie die Finalize-Methode für eine Struktur aufruft. Klassen werden durch den Garbage Collector (GC) beendet, der Finalize für eine Klasse aufruft, wenn er feststellt, dass keine aktiven Verweise mehr vorhanden sind.
Eine Struktur erfordert keinen Konstruktor, eine Klasse hingegen schon.
Strukturen können nur dann über nicht gemeinsame Konstruktoren verfügen, wenn sie Parameter annehmen; bei Klassen ist dies mit oder ohne Parameter möglich.
Jede Struktur verfügt über einen impliziten öffentlichen Konstruktor ohne Parameter. Dieser Konstruktor initialisiert alle Datenmember der Struktur mit ihren Standardwerten. Dafür kann kein anderes Verhalten definiert werden.
Instanzen und Variablen
Da es sich bei Strukturen um Werttypen handelt, sind Strukturvariablen immer permanent an eine einzelne Strukturinstanz gebunden. Klassen sind hingegen Verweistypen, und eine Objektvariable kann zu verschiedenen Zeitpunkten auf unterschiedliche Klasseninstanzen verweisen. Dieser Unterschied wirkt sich in folgender Weise auf die Verwendung von Strukturen und Klassen aus:
Initialisierung. Eine Strukturvariable umfasst implizit eine Initialisierung der Elemente mithilfe des parameterlosen Konstruktors der Struktur. Daher ist Dim s As struct1 gleichbedeutend mit Dim s As struct1 = New struct1().
Zuweisen von Variablen. Wenn Sie eine Strukturvariable einer anderen Strukturvariablen zuweisen oder eine Strukturinstanz an ein Prozedurargument übergeben, werden die aktuellen Werte aller Variablenelemente in die neue Struktur kopiert. Wenn Sie eine Objektvariable einer anderen Objektvariablen zuweisen oder eine Objektvariable an eine Prozedur übergeben, wird nur der Verweiszeiger kopiert.
Zuweisen von Nothing. Sie können einer Strukturvariablen den Wert Nothing (Visual Basic) zuweisen, jedoch bleibt die Instanz weiterhin der Variablen zugeordnet. Obwohl die Variablenelemente durch die Zuweisung neu initialisiert werden, können Sie die Methoden der Instanz aufrufen und auf die Datenelemente zugreifen.
Wenn Sie im Gegensatz dazu eine Objektvariable Nothing zuweisen, heben Sie die Zuweisung von allen Klasseninstanzen auf, und Sie können erst wieder über die Variable auf Member zugreifen, wenn Sie eine andere Instanz zuweisen.
Mehrere Instanzen. Einer Objektvariablen können zu unterschiedlichen Zeitpunkten verschiedene Klasseninstanzen zugewiesen sein, und verschiedene Objektvariablen können gleichzeitig auf dieselbe Klasseninstanz verweisen. Beim Zugriff über eine andere Variable, die auf dieselbe Instanz zeigt, wirken sich Änderungen an den Werten von Klassenmembern auf diese Member aus.
Strukturelemente sind hingegen in ihrer eigenen Instanz isoliert. Änderungen an den Werten werden nicht in anderen Strukturvariablen oder gar in anderen Instanzen derselben Structure-Deklaration wiedergegeben.
Gleichheit. Ein Gleichheitstest zweier Strukturen muss für jedes einzelne Element durchgeführt werden. Zwei Objektvariablen können mithilfe der Equals-Methode miteinander verglichen werden. Equals gibt an, ob die beiden Variablen auf dieselbe Instanz verweisen.
Siehe auch
Aufgaben
Problembehandlung bei Datentypen
Konzepte
Strukturen und andere Programmierelemente