Freigeben über


Strukturen und Klassen (Visual Basic)

Visual Basic vereint die Syntax für Strukturen und Klassen mit dem Ergebnis, dass beide Entitäten die meisten der gleichen Features unterstützen. Es gibt jedoch auch wichtige Unterschiede zwischen Strukturen und Klassen.

Klassen haben den Vorteil, Referenztypen zu sein – das Übergeben eines Verweises ist effizienter als das Übergeben einer Strukturvariable mit allen 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 Instanzgröße aufweist, und berücksichtigen Sie die Leistungsmerkmale von Klassen im Vergleich zu Strukturen.

Ähnlichkeiten

Strukturen und Klassen sind in der folgenden Hinsicht ähnlich:

  • Beide sind Containertypen, das bedeutet, dass sie andere Typen als Elemente enthalten.

  • Beide verfügen über Member, die Konstruktoren, Methoden, Eigenschaften, Felder, Konstanten, Enumerationen, Ereignisse und Ereignishandler enthalten können.

  • Mitglieder beider Gruppen können individuelle Zugriffsebenen haben. Beispielsweise kann ein Mitglied deklariert Public werden und ein anderes Private.

  • Beide können Schnittstellen implementieren.

  • Beide können gemeinsam genutzte Konstruktoren mit oder ohne Parameter haben.

  • Beide können eine Standardeigenschaft verfügbar machen, vorausgesetzt, diese Eigenschaft verwendet mindestens einen Parameter.

  • Beide können Ereignisse deklarieren und auslösen, und beide können Stellvertretungen 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 wie ein Klassentyp einen Verweis auf die Daten zu enthalten.

  • Strukturen verwenden Stapelzuordnung; Klassen verwenden Heap-Zuordnung.

  • Alle Strukturelemente sind Public standardmäßig vorhanden. Klassenvariablen und -konstanten sind Private standardmäßig, während andere Klassenmember standardmäßig vorhanden sind Public . Dieses Verhalten für Klassenmitglieder bietet Kompatibilität mit dem Visual Basic 6.0-System von Standardwerten.

  • Eine Struktur muss mindestens eine nicht freigabefähige Variable oder ein nicht freigabefähiges, nicht benutzerdefiniertes Ereigniselement aufweisen; eine Klasse kann vollständig leer sein.

  • Strukturelemente können nicht als Protected deklariert werden; Klassenmitglieder können dies jedoch.

  • Eine Strukturprozedur kann Ereignisse nur verarbeiten, wenn es sich um eine shared-ProzedurSub handelt, und nur mithilfe der AddHandler-Anweisung. Jede Klassenprozedur kann Ereignisse mithilfe des Handles-Schlüsselworts oder der AddHandler Anweisung verarbeiten. 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 von keinem anderen Typ erben. Klassen können von jeder Klasse außer System.ValueType erben.

  • Strukturen sind nicht vererbbar; Klassen sind.

  • Strukturen werden nie beendet, sodass die Common Language Runtime (CLR) niemals die Finalize Methode für jede Struktur aufruft. Klassen werden vom Garbage Collector (GC) beendet, der aufruft Finalize , wenn es erkennt, dass keine aktiven Verweise vorhanden sind.

  • Eine Struktur erfordert keinen Konstruktor; eine Klasse hingegen schon.

  • Strukturen können nur dann nicht gemeinsam verwendete Konstruktoren haben, wenn sie Parameter verwenden; Klassen können sie mit oder ohne Parameter enthalten.

Jede Struktur verfügt über einen impliziten öffentlichen Konstruktor ohne Parameter. Dieser Konstruktor initialisiert alle Datenelemente der Struktur auf ihre Standardwerte. Dieses Verhalten kann nicht neu definiert werden.

Instanzen und Variablen

Da Strukturen Werttypen sind, ist jede Strukturvariable dauerhaft an eine einzelne Strukturinstanz gebunden. Klassen sind jedoch Referenztypen, 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 enthält implizit eine Initialisierung der Elemente mithilfe des parameterlosen Konstruktors der Struktur. Daher entspricht Dim s As struct1Dim s As struct1 = New struct1().

  • Zuweisen von Variablen. Wenn Sie eine Strukturvariable einem anderen zuweisen oder eine Strukturinstanz an ein Prozedurargument übergeben, werden die aktuellen Werte aller Variablenelemente in die neue Struktur kopiert. Wenn Sie eine Objektvariable einem anderen zuweisen oder eine Objektvariable an eine Prozedur übergeben, wird nur der Verweiszeiger kopiert.

  • Zuweisen von Nothing. Sie können den Wert Nothing einer Strukturvariable zuweisen, aber die Instanz bleibt der Variablen zugeordnet. Sie können seine Methoden weiterhin aufrufen und auf seine Datenelemente zugreifen, obwohl variable Elemente von der Zuordnung neu initialisiert werden.

    Wenn Sie dagegen eine Objektvariable auf Nothingfestlegen, trennen Sie sie von einer beliebigen Klasseninstanz, und Sie können erst dann auf Elemente über die Variable zugreifen, wenn Sie ihm eine andere Instanz zuweisen.

  • Mehrere Instanzen. Eine Objektvariable kann unterschiedlichen Klasseninstanzen zu unterschiedlichen Zeiten zugewiesen werden, und mehrere Objektvariablen können gleichzeitig auf dieselbe Klasseninstanz verweisen. Änderungen, die Sie an den Werten von Klassenmitgliedern vornehmen, wirken sich auf diese Member aus, wenn auf eine andere Variable zugegriffen wird, die auf dieselbe Instanz verweist.

    Strukturelemente sind jedoch innerhalb ihrer eigenen Instanz isoliert. Änderungen an ihren Werten werden nicht in anderen Strukturvariablen widergespiegelt, auch nicht in anderen Instanzen derselben Structure Deklaration.

  • Gleichheit. Gleichheitstests von zwei Strukturen müssen mit einem Element-nach-Element-Test durchgeführt werden. Mit der Equals Methode können zwei Objektvariablen verglichen werden. Equals gibt an, ob die beiden Variablen auf dieselbe Instanz verweisen.

Siehe auch