Shared (Visual Basic)

Określa, że co najmniej jeden zadeklarowany element programowania jest skojarzony z klasą lub strukturą na dużą ogóle, a nie z określonym wystąpieniem klasy lub struktury.

Kiedy używać udostępnionego

Udostępnianie elementu członkowskiego klasy lub struktury sprawia, że jest on dostępny dla każdego wystąpienia, a nie współużytkowanego, gdzie każde wystąpienie przechowuje własną kopię. Udostępnianie jest przydatne, na przykład jeśli wartość zmiennej ma zastosowanie do całej aplikacji. Jeśli zadeklarowasz, że zmienna ma mieć Sharedwartość , wszystkie wystąpienia uzyskują dostęp do tej samej lokalizacji magazynu, a jeśli jedno wystąpienie zmieni wartość zmiennej, wszystkie wystąpienia uzyskują dostęp do zaktualizowanej wartości.

Udostępnianie nie zmienia poziomu dostępu członka. Na przykład składowa klasy może być współdzielona i prywatna (dostępna tylko z poziomu klasy) lub nieudostępniana i publiczna. Aby uzyskać więcej informacji, zobacz Poziomy dostępu w Visual Basic.

Reguły

  • Kontekst deklaracji. Można używać Shared tylko na poziomie modułu. Oznacza to, że kontekst deklaracji elementu Shared musi być klasą lub strukturą i nie może być plikiem źródłowym, przestrzenią nazw lub procedurą.

  • Modyfikatory połączone. Nie można określić Shared razem z przesłonięciami, przesłonięciami, NotOverridable, MustOverride lub Static w tej samej deklaracji.

  • Uzyskiwanie dostępu do. Uzyskujesz dostęp do elementu udostępnionego, kwalifikując go z nazwą klasy lub struktury, a nie nazwą zmiennej określonego wystąpienia klasy lub struktury. Nie trzeba nawet tworzyć wystąpienia klasy lub struktury, aby uzyskać dostęp do udostępnionych składowych.

    Poniższy przykład wywołuje udostępnioną procedurę IsNaN uwidocznioną Double przez strukturę.

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • Udostępnianie niejawne. Modyfikator nie może być używany Shared w instrukcji Const, ale stałe są niejawnie udostępniane. Podobnie nie można zadeklarować elementu członkowskiego modułu lub interfejsu jako Shared, ale są one niejawnie udostępniane.

Zachowanie

  • Magazyn. Współdzielona zmienna lub zdarzenie są przechowywane w pamięci tylko raz, niezależnie od liczby lub kilku wystąpień tworzonych przez klasę lub strukturę. Podobnie współużytkowana procedura lub właściwość zawiera tylko jeden zestaw zmiennych lokalnych.

  • Uzyskiwanie dostępu za pośrednictwem zmiennej wystąpienia. Można uzyskać dostęp do elementu udostępnionego, kwalifikując go nazwą zmiennej zawierającej określone wystąpienie jej klasy lub struktury. Chociaż zwykle działa to zgodnie z oczekiwaniami, kompilator generuje komunikat ostrzegawczy i uzyskuje dostęp za pośrednictwem nazwy klasy lub struktury zamiast zmiennej.

  • Uzyskiwanie dostępu za pomocą wyrażenia wystąpienia. Jeśli uzyskujesz dostęp do elementu udostępnionego za pomocą wyrażenia zwracającego wystąpienie klasy lub struktury, kompilator uzyskuje dostęp za pośrednictwem nazwy klasy lub struktury zamiast oceniania wyrażenia. Ten dostęp generuje nieoczekiwane wyniki, jeśli wyrażenie ma wykonywać inne akcje, a także zwracać wystąpienie. Poniższy przykład ilustruje tę sytuację.

    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
    

    W poprzednim przykładzie kompilator generuje komunikat ostrzegawczy jednocześnie, gdy kod uzyskuje dostęp do właściwości Total udostępnionej za pośrednictwem wystąpienia. W każdym przypadku dostęp jest uzyskiwany bezpośrednio za pośrednictwem klasy ShareTotal i nie korzysta z żadnego wystąpienia. W przypadku zamierzonego wywołania procedury ReturnClassoznacza to, że nie generuje nawet wywołania metody ReturnClass, więc nie jest wykonywana dodatkowa akcja wyświetlania wywołania funkcji ReturnClass().

Modyfikator Shared może być używany w następujących kontekstach:

Zobacz też