Shared (Visual Basic)

Gibt an, dass ein oder mehrere deklarierte Programmierelemente einer Klasse oder Struktur im Allgemeinen und nicht einer bestimmten Instanz der Klasse oder Struktur zugeordnet sind.

Verwendung von Shared

Durch das Freigeben eines Members einer Klasse oder Struktur wird er für jede Instanz und nicht für nicht freigegebene Elemente verfügbar, wobei jede Instanz ihre eigene Kopie behält. Die Freigabe ist z. B. hilfreich, wenn der Wert einer Variablen für die gesamte Anwendung gilt. Wenn Sie diese Variable als Shared deklarieren, greifen alle Instanzen auf denselben Speicherort zu. Wenn eine Instanz den Wert der Variablen ändert, greifen alle Instanzen auf den aktualisierten Wert zu.

Die Freigabe ändert nicht die Zugriffsebene eines Members. Zum Beispiel kann ein Klassenmember freigegeben und privat (Zugriff nur innerhalb der Klasse) oder nicht freigegeben und öffentlich sein. Weitere Informationen finden Sie unter Zugriffsebenen in Visual Basic.

Regeln

  • Deklarationskontext. Sie können Shared nur auf Modulebene verwenden. Das bedeutet, dass der Deklarationskontext für ein Shared-Element eine Klasse oder Struktur sein muss und weder eine Quelldatei noch ein Namespace noch eine Prozedur sein darf.

  • Kombinierte Modifizierer. Sie können in der gleichen Deklaration Shared nicht zusammen mit Overrides, Overridable, NotOverridable, MustOverride oder Static angeben.

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

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

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • Implizite Freigabe. Sie können den Shared-Modifizierer nicht in einer Const-Anweisung verwenden, aber Konstanten werden implizit freigegeben. Ebenso können Sie einen Member eines Moduls oder einer Schnittstelle nicht als Shared deklarieren, aber sie sind implizit freigegeben.

Verhalten

  • Speicher Eine freigegebene Variable oder ein freigegebenes Ereignis wird nur einmal im Arbeitsspeicher gespeichert, unabhängig davon, wie viele oder wenige Instanzen Sie von ihrer Klasse oder Struktur erstellen. Ebenso enthält eine freigegebene Prozedur oder Eigenschaft nur einen Satz lokaler Variablen.

  • Zugriff über eine Instanzvariable. Es ist möglich, auf ein freigegebenes Element zuzugreifen, indem es mit dem Namen einer Variablen qualifiziert wird, die eine bestimmte Instanz ihrer Klasse oder Struktur enthält. Obwohl dies normalerweise wie erwartet funktioniert, generiert der Compiler eine Warnmeldung und nimmt den Zugriff über den Klassen- oder Strukturnamen statt über die Variable vor.

  • Zugriff über einen Instanzausdruck. Wenn Sie über einen Ausdruck, der eine Instanz seiner Klasse oder Struktur zurückgibt, auf ein freigegebenes Element zugreifen, nimmt der Compiler den Zugriff über den Klassen- oder Strukturnamen vor, anstatt den Ausdruck auszuwerten. Dieser Zugriff führt zu unerwarteten Ergebnissen, wenn Sie beabsichtigen, dass der Ausdruck neben der Rückgabe der Instanz auch andere Aktionen ausführt. Das folgende Beispiel veranschaulicht diese Situation.

    Sub Main()
        ' The following line is the preferred way to access Total.
        ShareTotal.Total = 10
    
        ' The following 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.
        Dim instanceVar As New ShareTotal
        instanceVar.Total += 100
    
        ' The following 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 WriteLine in ReturnClass() does not run.
        Console.WriteLine("Value of total is " & CStr(ShareTotal.Total))
        ReturnClass().Total += 1000
    End Sub
    
    Public Function ReturnClass() As ShareTotal
        Console.WriteLine("Function ReturnClass() called")
        Return New ShareTotal
    End Function
    
    Public Class ShareTotal
        Public Shared Property Total As Integer
    End Class
    

    Im vorherigen Beispiel generiert der Compiler beide Male eine Warnmeldung, wenn der Code über eine Instanz auf die freigegebene Eigenschaft Total zugreift. In allen Fällen erfolgt der Zugriff direkt über die ShareTotal-Klasse, ohne dass eine Instanz verwendet wird. Im Falle des beabsichtigten Aufrufs der Prozedur ReturnClass bedeutet dies, dass sie nicht einmal einen Aufruf von ReturnClass so generiert, dass die zusätzliche Aktion der Anzeige von „Funktion ReturnClass() aufgerufen“ nicht erfolgt.

Der Shared-Modifizierer kann in folgenden Kontexten verwendet werden:

Siehe auch