Megosztott (Visual Basic)
Azt határozza meg, hogy egy vagy több deklarált programozási elem nagy méretű osztályhoz vagy struktúrához legyen társítva, és ne az osztály vagy struktúra egy adott példányához.
Mikor érdemes használni a megosztott halmazt?
Egy osztály vagy struktúra egy tagjának megosztása minden példány számára elérhetővé teszi a nem megosztott példányok helyett, ahol minden példány megőrzi a saját példányát. A megosztás például akkor hasznos, ha egy változó értéke a teljes alkalmazásra vonatkozik. Ha ezt a változót Shared
deklarálja, akkor minden példány ugyanazt a tárolási helyet éri el, és ha egy példány módosítja a változó értékét, az összes példány hozzáfér a frissített értékhez.
A megosztás nem módosítja a tagok hozzáférési szintjét. Az osztálytagok lehetnek például megosztottak és privátak (csak az osztályon belülről érhetők el), vagy nem megosztottak és nyilvánosak. További információ: Hozzáférési szintek a Visual Basicben.
Szabályok
Deklarációs környezet. Csak modulszinten használható
Shared
. Ez azt jelenti, hogy egyShared
elem deklarációs környezetének osztálynak vagy struktúrának kell lennie, és nem lehet forrásfájl, névtér vagy eljárás.Kombinált módosítók. Ugyanabban a deklarációban nem adhat meg
Shared
felülbírálásokat, felülbírálható, Nem módosítható, MustOverride vagy Statikus értéket.Bejutó. A megosztott elemet úgy érheti el, hogy osztály- vagy struktúranévvel minősíti azt, nem pedig az osztály vagy struktúra egy adott példányának változó nevével. Nem is kell létrehoznia egy osztály vagy struktúra egy példányát a megosztott tagok eléréséhez.
Az alábbi példa meghívja a struktúra által Double közzétett megosztott eljárástIsNaN.
If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
Implicit megosztás. A módosító nem használható const
Shared
utasításban, de az állandók implicit módon meg vannak osztva. Hasonlóképpen nem deklarálhatja egy modul vagy felületShared
tagját, de implicit módon meg van osztva.
Működés
Tárhely. A megosztott változókat vagy eseményeket a rendszer csak egyszer tárolja a memóriában, függetlenül attól, hogy hány vagy néhány példányt hoz létre annak osztályából vagy szerkezetéből. Hasonlóképpen, egy megosztott eljárás vagy tulajdonság csak egy helyi változókészletet tartalmaz.
Hozzáférés egy példányváltozón keresztül. A megosztott elemeket úgy érheti el, hogy egy olyan változó nevével minősíti, amely az osztályának vagy szerkezetének egy adott példányát tartalmazza. Bár ez általában a várt módon működik, a fordító figyelmeztető üzenetet hoz létre, és a változó helyett az osztály vagy a struktúranév használatával teszi lehetővé a hozzáférést.
Hozzáférés egy példánykifejezésen keresztül. Ha egy megosztott elemet egy olyan kifejezésen keresztül ér el, amely az osztály vagy a struktúra egy példányát adja vissza, a fordító a kifejezés kiértékelése helyett az osztály vagy a struktúranév használatával teszi lehetővé a hozzáférést. Ez a hozzáférés váratlan eredményeket eredményez, ha a kifejezést más műveletek végrehajtására, valamint a példány visszaadására szánta. Az alábbi példa ezt a helyzetet szemlélteti.
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
Az előző példában a fordító egy figyelmeztető üzenetet hoz létre, mindkét alkalommal, amikor a kód egy példányon keresztül éri el a megosztott tulajdonságot
Total
. Minden esetben közvetlenül az osztályonShareTotal
keresztül teszi elérhetővé a hozzáférést, és egyetlen példányt sem használ. Az eljárásReturnClass
tervezett hívása esetén ez azt jelenti, hogy még csak nem is hoz létre hívástReturnClass
, így a függvény returnclass() meghívásának további művelete nem történik meg.
A Shared
módosító az alábbi környezetekben használható: