Shared (Visual Basic)

Aktualisiert: November 2007

Gibt an, dass mindestens ein deklariertes Programmierelement einer Klasse oder Struktur im Allgemeinen und nicht einer bestimmten Instanz der Klasse bzw. Struktur zugeordnet ist.

Hinweise

Verwendung von Shared

Durch die Freigabe eines Klassen- oder Strukturmembers wird dieser allen Instanzen verfügbar gemacht, sodass die einzelnen Instanzen im Gegensatz zu nicht freigegebenen Membern nicht über eine eigene Kopie verfügen. Dies ist z. B. hilfreich, wenn der Wert einer Variablen für die ganze Anwendung gilt. Wenn Sie diese Variable als Shared deklarieren, greifen alle Instanzen auf den gleichen Speicherort zu. Wenn eine Instanz den Wert der Variablen ändert, greifen alle Instanzen auf den aktualisierten Wert zu.

Durch die Freigabe ändert sich nicht die Zugriffsebene eines Members. Ein Klassenmember kann z. B. freigegeben und privat (nur innerhalb der Klasse aufrufbar) oder nicht freigegeben und öffentlich sein. Weitere Informationen finden Sie unter Zugriffsebenen in Visual Basic.

Regeln

  • **Deklarationskontext.**Shared kann nur auf Modulebene verwendet werden. Dies bedeutet, dass der Deklarationskontext für ein Shared-Element eine Klasse oder Struktur sein muss und keine Quelldatei, kein Namespace oder keine Prozedur sein kann.

  • Kombinierte Modifizierer. Sie können Shared nicht zusammen mit Overrides, Overridable, NotOverridable, MustOverride oder Static (Visual Basic) in derselben Deklaration angeben.

  • Zugriff. Sie können auf ein freigegebenes Element zugreifen, indem Sie es mit seinem Klassen- oder Strukturnamen und nicht mit dem Variablennamen einer bestimmten Instanz seiner Klasse oder Struktur qualifizieren. Sie müssen nicht einmal eine Instanz einer Klasse oder Struktur erstellen, um auf seine freigegebenen Member zuzugreifen.

    Im folgenden Beispiel wird die freigegebene IsNaN-Prozedur aufgerufen, die durch die Double-Struktur verfügbar gemacht wird.

    If Double.IsNaN(result) Then MsgBox("Result is mathematically undefined.")

  • Implizite Freigabe. Sie können den Shared-Modifizierer nicht in einer Const-Anweisung (Visual Basic) verwenden; Konstanten sind jedoch implizit freigegeben. Genauso können Sie keinen Member eines Moduls oder einer Schnittstelle als Shared deklarieren; sie sind aber implizit freigegeben.

Verhalten

  • Speicher. Eine freigegebene Variable oder ein freigegebenes Ereignis wird nur einmal im Speicher gespeichert. Dies ist unabhängig von der Anzahl von Instanzen, die Sie aus ihrer bzw. seiner Klasse oder Struktur erstellen. Genauso enthält eine freigegebene Prozedur oder Eigenschaft nur einen Satz lokaler Variablen.

  • Zugriff über eine Instanzenvariable. Ein Zugriff auf das freigegebene Element ist möglich, indem das Element mit dem Namen einer Variablen qualifiziert wird, die eine bestimmte Instanz seiner Klasse oder Struktur enthält. Obwohl dies im Allgemeinen wie erwartet funktioniert, generiert der Compiler eine Warnung und führt den Zugriff über den Klassen- oder Strukturnamen anstatt über die Variable durch.

  • Zugriff über einen Instanzenausdruck. Wenn Sie auf ein freigegebenes Element zugreifen und dabei einen Ausdruck verwenden, der eine Instanz der Klasse oder der Struktur des freigegebenen Elements zurückgibt, führt der Compiler den Zugriff über den Klassen- oder Strukturnamen durch, anstatt den Ausdruck auszuwerten. Dies führt zu unerwarteten Ergebnissen, wenn der Ausdruck andere Aktionen ausführen und die Instanz zurückgeben sollte. Dies wird anhand des folgenden Beispiels veranschaulicht:

    Sub main()
        shareTotal.total = 10
        ' The preceding line is the preferred way to access total.
        Dim instanceVar As New shareTotal
        instanceVar.total += 100
        ' The preceding line generates a compiler warning message and
        ' accesses total through class shareTotal instead of through
        ' the variable instanceVar. This works as expected and adds
        ' 100 to total.
        returnClass().total += 1000
        ' The preceding line generates a compiler warning message and
        ' accesses total through class shareTotal instead of calling
        ' returnClass(). This adds 1000 to total but does not work as
        ' expected, because the MsgBox in returnClass() does not run.
        MsgBox("Value of total is " & CStr(shareTotal.total))
    End Sub
    Public Function returnClass() As shareTotal
        MsgBox("Function returnClass() called")
        Return New shareTotal
    End Function
    Public Class shareTotal
        Public Shared total As Integer
    End Class
    

    Im vorhergehenden Beispiel wird in beiden Fällen, in denen der Code über eine Instanz auf die freigegebene Variable total zugreift, eine Warnung generiert. Der Code greift jedes Mal direkt über die shareTotal-Klasse zu und verwendet keine Instanz. Im Fall des beabsichtigten Aufrufs der returnClass-Prozedur bedeutet dies, dass der Code nicht einmal einen Aufruf von returnClass generiert, sodass die zusätzliche Aktion, nämlich das Anzeigen von "Function returnClass() called", nicht ausgeführt wird.

Der Shared-Modifizierer kann in den folgenden Kontexten verwendet werden:

Dim-Anweisung

Event-Anweisung

Function-Anweisung

Operator-Anweisung

Property-Anweisung

Sub-Anweisung

Siehe auch

Konzepte

Lebensdauer in Visual Basic

Prozeduren in Visual Basic

Freigegebene Member in Visual Basic

Referenz

Shadows

Static (Visual Basic)

Weitere Ressourcen

Strukturen: Benutzerdefinierte Datentypen

Was sind Klassen?