Shared (Visual Basic)

Určuje, že jeden nebo více deklarovaných programovacích prvků jsou přidruženy k třídě nebo struktuře na velké, a nikoli s konkrétní instancí třídy nebo struktury.

Kdy použít shared

Sdílením členu třídy nebo struktury je k dispozici pro každou instanci místo nes sdílené , kde si každá instance uchovává vlastní kopii. Sdílení je užitečné například v případě, že hodnota proměnné platí pro celou aplikaci. Pokud tuto proměnnou deklarujete jako , přistupují všechny instance ke stejnému umístění úložiště, a pokud jedna instance změní hodnotu proměnné, všechny instance přistupují k Shared aktualizované hodnotě.

Sdílení nemění úroveň přístupu člena. Člen třídy může být například sdílen a soukromý (přístupný pouze z třídy) nebo nes sdílený a veřejný. Další informace najdete v tématu Úrovně přístupu v Visual Basic.

Pravidla

  • Kontext deklarace. Můžete použít Shared pouze na úrovni modulu. To znamená, že kontext deklarace elementu musí být třída nebo struktura a nemůže to být zdrojový Shared soubor, obor názvů nebo procedura.

  • Kombinované modifikátory. Ve stejné deklaraci nelze zadat spolu s vlastnostmi Shared Overrides, Overridable, NotOverridable, MustOverridenebo Static.

  • Přístup. Ke sdílenému prvku se přistupuje tak, že ho kvalifikuje pomocí názvu třídy nebo struktury, nikoli s názvem proměnné konkrétní instance její třídy nebo struktury. Pro přístup ke sdíleným členům není dokonce ani třeba vytvořit instanci třídy nebo struktury.

    Následující příklad volá sdílenou proceduru IsNaN vystavenou Double strukturou.

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • Implicitní sdílení. Modifikátor nelze Shared použít v příkazu Const, ale konstanty jsou implicitně sdíleny. Podobně nelze deklarovat člen modulu nebo rozhraní , ale Shared jsou implicitně sdíleny.

Chování

  • Storage. Sdílená proměnná nebo událost se ukládá v paměti pouze jednou bez ohledu na to, kolik nebo několik instancí její třídy nebo struktury vytvoříte. Podobně platí, že sdílená procedura nebo vlastnost obsahuje pouze jednu sadu místních proměnných.

  • Přístup prostřednictvím proměnné instance. Ke sdílenému prvku je možné přistupovat tak, že ho kvalifikuje pomocí názvu proměnné, která obsahuje konkrétní instanci své třídy nebo struktury. I když to obvykle funguje podle očekávání, kompilátor vygeneruje zprávu upozornění a provede přístup prostřednictvím názvu třídy nebo struktury místo proměnné.

  • Přístup prostřednictvím výrazu instance Pokud máte přístup ke sdílenému prvku prostřednictvím výrazu, který vrací instanci své třídy nebo struktury, kompilátor místo vyhodnocení výrazu zajistí přístup prostřednictvím názvu třídy nebo struktury. Tento přístup vede k neočekávaným výsledkům, pokud jste zamýšleli, aby výraz prováděl další akce a také vrátil instanci. Tuto situaci ilustruje následující příklad.

    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
    

    V předchozím příkladu kompilátor vygeneruje zprávu upozornění oběma časy, kdy kód přistupuje ke sdílené vlastnosti Total prostřednictvím instance. V každém případě přistupuje přímo prostřednictvím třídy a nevyušuje ShareTotal žádnou instanci. V případě zamýšleného volání procedury to znamená, že ani negeneruje volání metody , takže se neprovádí další akce zobrazení volání funkce ReturnClass ReturnClass ReturnClass().

SharedModifikátor lze použít v těchto kontextech:

Viz také