Megosztás a következőn keresztül:


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 Shareddeklará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 egy Shared 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ület Sharedtagjá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ályon ShareTotal keresztül teszi elérhetővé a hozzáférést, és egyetlen példányt sem használ. Az eljárás ReturnClasstervezett hívása esetén ez azt jelenti, hogy még csak nem is hoz létre hívást ReturnClass, í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ó:

Lásd még