Strukturen und Klassen (Visual Basic)
Visual Basic vereinheitlicht die Syntax für Strukturen und Klassen, sodass beide Entitäten die meisten der gleichen Features unterstützen. Es gibt jedoch auch wichtige Unterschiede zwischen Strukturen und Klassen.
Klassen haben den Vorteil, dass es sich um Verweistypen handelt – das Übergeben eines Verweises ist effizienter als das Übergeben einer Strukturvariable mit all ihren Daten. Auf der anderen Seite erfordern Strukturen keine Zuweisung von Arbeitsspeicher auf dem globalen Heap.
Da Sie nicht von einer -Struktur erben können, sollten Strukturen nur für Objekte verwendet werden, die nicht erweitert werden müssen. Verwenden Sie Strukturen, wenn das Objekt, das Sie erstellen möchten, eine kleine instance Größe aufweist, und berücksichtigen Sie die Leistungsmerkmale von Klassen im Vergleich zu Strukturen.
Ähnlichkeiten
Strukturen und Klassen ähneln sich in den folgenden Punkten:
Beide sind Containertypen , was bedeutet, dass sie andere Typen als Member enthalten.
Beide verfügen über Member, die Konstruktoren, Methoden, Eigenschaften, Felder, Konstanten, Enumerationen, Ereignisse und Ereignishandler enthalten können.
Mitglieder beider können über individuelle Zugriffsebenen verfügen. Beispielsweise kann ein Member und ein weiteres
Public
deklariertPrivate
werden.Beide können Schnittstellen implementieren.
Beide können freigegebene Konstruktoren mit oder ohne Parameter haben.
Beide können eine Standardeigenschaft verfügbar machen, sofern diese Eigenschaft mindestens einen Parameter akzeptiert.
Beide können Ereignisse deklarieren und auslösen, und beide können Delegaten deklarieren.
Unterschiede
Strukturen und Klassen unterscheiden sich in den folgenden Besonderheiten:
Strukturen sind Werttypen, Klassen sind Referenztypen. Eine Variable eines Strukturtyps enthält die Daten der Struktur, anstatt einen Verweis auf die Daten wie ein Klassentyp zu enthalten.
Strukturen verwenden stapelweise Zuordnung; -Klassen verwenden die Heapzuordnung.
Alle Strukturelemente sind
Public
standardmäßig vorhanden. Klassenvariablen und Konstanten sindPrivate
standardmäßig, während andere Klassenmember standardmäßig vorhanden sindPublic
. Dieses Verhalten für Klassenmember bietet Kompatibilität mit dem Standardsystem von Visual Basic 6.0.Eine Struktur muss mindestens eine nicht freigegebene Variable oder ein nicht freigegebenes, nicht benutzerdefiniertes Ereigniselement aufweisen. eine Klasse kann vollständig leer sein.
Strukturelemente können nicht als
Protected
deklariert werden; Klassenmember können.Eine Strukturprozedur kann Ereignisse nur verarbeiten, wenn es sich um eine Shared-Prozedur
Sub
handelt, und nur mithilfe der AddHandler-Anweisung. Jede Klassenprozedur kann Ereignisse mithilfe der Handles-Schlüsselwort (keyword) oder derAddHandler
-Anweisung behandeln. Weitere Informationen finden Sie unter Ereignisse.Strukturvariablendeklarationen können keine Initialisierer oder Anfangsgrößen für Arrays angeben. Klassenvariablendeklarationen können.
Strukturen erben implizit von der System.ValueType -Klasse und können nicht von einem anderen Typ erben. Klassen können von jeder Klasse oder klassen außer System.ValueTypeerben.
Strukturen sind nicht vererbbar; -Klassen sind.
Strukturen werden nie beendet, sodass die Common Language Runtime (CLR) niemals die Finalize -Methode für eine beliebige Struktur aufruft. Klassen werden vom Garbage Collector (GC) beendet, der eine Klasse aufruft Finalize , wenn erkannt wird, dass keine aktiven Verweise mehr vorhanden sind.
Eine -Struktur erfordert keinen Konstruktor. eine -Klasse tut dies.
Strukturen können nur dann über nicht freigegebene Konstruktoren verfügen, wenn sie Parameter annehmen. Klassen können sie mit oder ohne Parameter aufweisen.
Jede Struktur verfügt über einen impliziten öffentlichen Konstruktor ohne Parameter. Dieser Konstruktor initialisiert alle Datenelemente der Struktur mit ihren Standardwerten. Sie können dieses Verhalten nicht neu definieren.
Instanzen und Variablen
Da Strukturen Werttypen sind, ist jede Strukturvariable dauerhaft an eine einzelne Struktur instance gebunden. Klassen sind jedoch Verweistypen, und eine Objektvariable kann zu unterschiedlichen Zeiten auf verschiedene Klasseninstanzen verweisen. Diese Unterscheidung wirkt sich auf die Verwendung von Strukturen und Klassen wie folgt aus:
Initialisierung. Eine Strukturvariable schließt implizit eine Initialisierung der Elemente mithilfe des parameterlosen Konstruktors der Struktur ein. Daher entspricht
Dim s As struct1
Dim s As struct1 = New struct1()
.Zuweisen von Variablen. Wenn Sie eine Strukturvariable einer anderen zuweisen oder eine Struktur instance an ein Prozedurargument übergeben, werden die aktuellen Werte aller Variablenelemente in die neue Struktur kopiert. Wenn Sie eine Objektvariable einer anderen zuweisen oder eine Objektvariable an eine Prozedur übergeben, wird nur der Verweiszeiger kopiert.
Zuweisen von Nothing. Sie können den Wert Nothing einer Strukturvariablen zuweisen, aber die instance wird weiterhin der Variablen zugeordnet. Sie können weiterhin seine Methoden aufrufen und auf die zugehörigen Datenelemente zugreifen, obwohl Variablenelemente durch die Zuweisung neu initialisiert werden.
Wenn Sie dagegen eine Objektvariable auf
Nothing
festlegen, trennen Sie sie von allen Klassen instance, und Sie können erst dann über die Variable auf Member zugreifen, wenn Sie ihr einen weiteren instance zuweisen.Mehrfache Instanzen. Einer Objektvariablen können zu unterschiedlichen Zeitpunkten unterschiedliche Klasseninstanzen zugewiesen werden, und mehrere Objektvariablen können gleichzeitig auf dieselbe Klasse instance verweisen. Änderungen, die Sie an den Werten der Klassenmember vornehmen, wirken sich auf diese Member aus, wenn der Zugriff über eine andere Variable erfolgt, die auf dieselbe instance zeigt.
Strukturelemente sind jedoch innerhalb ihrer eigenen instance isoliert. Änderungen an ihren Werten spiegeln sich nicht in anderen Strukturvariablen wider, auch nicht in anderen Instanzen derselben
Structure
-Deklaration.Gleichheit. Gleichheitstests von zwei Strukturen müssen mit einem Element-für-Element-Test durchgeführt werden. Zwei Objektvariablen können mithilfe der Equals-Methode verglichen werden. Equalsgibt an, ob die beiden Variablen auf dieselbe instance verweisen.