Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gibt an, dass einem oder mehreren deklarierten Programmierelementen eine Klasse oder Struktur in großem Umfang und nicht eine bestimmte Instanz der Klasse oder Struktur zugeordnet ist.
Verwendung von "Freigegeben"
Durch die Freigabe eines Elements einer Klasse oder Struktur wird es für jede Instanz und nicht freigegeben verfügbar, wobei jede Instanz ihre eigene Kopie behält. Die Freigabe ist beispielsweise hilfreich, wenn der Wert einer Variablen für die gesamte Anwendung gilt. Wenn Sie diese Variable deklarieren, greifen alle Instanzen auf denselben Speicherort zu, und wenn eine Instanz den Wert der Variablen Sharedändert, greifen alle Instanzen auf den aktualisierten Wert zu.
Die Freigabe ändert nicht die Zugriffsebene eines Mitglieds. Ein Klassenmitglied kann z. B. freigegeben und privat (nur innerhalb der Klasse zugänglich) oder nicht freigegeben und öffentlich sein. Weitere Informationen finden Sie unter Access-Ebenen in Visual Basic.
Regeln
Deklarationskontext. Sie können nur auf Modulebene verwenden
Shared. Dies bedeutet, dass der Deklarationskontext für einSharedElement eine Klasse oder Struktur sein muss und keine Quelldatei, ein Namespace oder eine Prozedur sein kann.Kombinierte Modifizierer. Sie können nicht zusammen mit Overrides, Overridable, NotOverridable, MustOverride oder Static in derselben Deklaration angeben
Shared.Zugreifend. Sie greifen auf ein freigegebenes Element zu, indem Sie es mit dem Klassen- oder Strukturnamen qualifizieren, nicht mit dem Variablennamen einer bestimmten Instanz der Klasse oder Struktur. Sie müssen nicht einmal eine Instanz einer Klasse oder Struktur erstellen, um auf die freigegebenen Member zuzugreifen.
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
SharedModifizierer nicht in einer Const-Anweisung verwenden, aber Konstanten werden implizit freigegeben. Ebenso können Sie kein Mitglied eines Moduls oder einer SchnittstelleShareddeklarieren, sie werden jedoch implizit freigegeben.
Verhalten
Lagerung. Eine freigegebene Variable oder ein Freigegebenes Ereignis wird nur einmal im Arbeitsspeicher gespeichert, unabhängig davon, wie viele oder wenige Instanzen Sie deren 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 seiner Klasse oder Struktur enthält. Obwohl dies normalerweise wie erwartet funktioniert, generiert der Compiler eine Warnmeldung und macht den Zugriff über den Klassen- oder Strukturnamen anstelle der Variablen.
Zugriff über einen Instanzausdruck. Wenn Sie auf ein freigegebenes Element über einen Ausdruck zugreifen, der eine Instanz seiner Klasse oder Struktur zurückgibt, macht der Compiler den Zugriff über den Klassen- oder Strukturnamen, anstatt den Ausdruck auszuwerten. Dieser Zugriff erzeugt unerwartete Ergebnisse, wenn Sie beabsichtigen, dass der Ausdruck andere Aktionen ausführt und die Instanz zurückgibt. 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 ClassIm vorherigen Beispiel generiert der Compiler eine Warnmeldung, wenn der Code über eine Instanz auf die freigegebene Eigenschaft
Totalzugreift. In jedem Fall erfolgt der Zugriff direkt über die KlasseShareTotalund verwendet keine Instanz. Im Falle des beabsichtigten Aufrufs der ProzedurReturnClassbedeutet dies, dass er nicht einmal einen AufrufReturnClassgeneriert, sodass die zusätzliche Aktion zum Anzeigen von "Function ReturnClass() called" nicht ausgeführt wird.
Der Shared Modifizierer kann in folgenden Kontexten verwendet werden:
- Dim-Anweisung
- Event-Mitteilung
- Funktionsanweisung
- Operator-Erklärung
- Eigenschaftserklärung
- Sub-Anweisung