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 Shared
vš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 prvkuShared
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ýtShared
, 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řídyShareTotal
a nevyužívá žádnou instanci. V případě zamýšleného volání proceduryReturnClass
to 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: