Shared (Visual Basic)

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

Kdy použít sdílené

Sdílení člena třídy nebo struktury zpřístupňuje každou instanci, nikoli nesdílenou, kde 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 tak, že Sharedvšechny instance přistupují ke stejnému umístění úložiště a pokud jedna instance změní hodnotu proměnné, všechny instance přistupují k 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éto třídy) nebo nesdílený a veřejný. Další informace naleznete v tématu Úrovně přístupu v jazyce Visual Basic.

Pravidla

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

  • Kombinované modifikátory. Ve stejné deklaraci nelze zadat Shared společně s přepsání, přepisovatelnými, NotOverridable, MustOverride nebo Statickými .

  • Přístup. Sdílený prvek získáte tak, že ho opravíte pomocí názvu třídy nebo struktury, nikoli s názvem proměnné konkrétní instance třídy nebo struktury. Pro přístup ke sdíleným členům nemusíte ani vytvářet instanci třídy nebo struktury.

    Následující příklad volá sdílený postup IsNaN vystavený strukturou Double .

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

Chování

  • Úložiště: Sdílená proměnná nebo událost je uložena v paměti pouze jednou, bez ohledu na to, kolik nebo málo instancí vytvoříte z její třídy nebo struktury. Podobně sdílená procedura nebo vlastnost obsahuje pouze jednu sadu místních proměnných.

  • Přístup prostřednictvím proměnné instance. Sdílený prvek je možné získat tak, že ho opravníte názvem proměnné, která obsahuje konkrétní instanci třídy nebo struktury. I když to obvykle funguje podle očekávání, kompilátor vygeneruje zprávu s upozorněním a vytvoří přístup prostřednictvím názvu třídy nebo struktury místo proměnné.

  • Přístup prostřednictvím výrazu instance Pokud přistupujete ke sdílenému prvku prostřednictvím výrazu, který vrací instanci jeho třídy nebo struktury, kompilátor vytvoří přístup prostřednictvím názvu třídy nebo struktury místo vyhodnocení výrazu. Tento přístup generuje neočekávané výsledky, pokud jste chtěli výraz provést jiné akce a vrátit instanci. Následující příklad ukazuje tuto situaci.

    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 varovnou zprávu, kdy kód přistupuje ke sdílené vlastnosti Total prostřednictvím instance. V každém případě zpřístupňuje přístup přímo prostřednictvím třídy ShareTotal a nevyužívá žádnou instanci. V případě zamýšleného volání procedury ReturnClassto znamená, že ani negeneruje volání ReturnClass, takže další akce zobrazení "Function ReturnClass() volána" není provedena.

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

Viz také