Dela via


Delad (Visual Basic)

Anger att ett eller flera deklarerade programmeringselement är associerade med en klass eller struktur i stort och inte med en specifik instans av klassen eller strukturen.

När du ska använda delad

Genom att dela en medlem i en klass eller struktur blir den tillgänglig för varje instans, i stället för icke-delad, där varje instans behåller sin egen kopia. Delning är användbart, till exempel om värdet för en variabel gäller för hela programmet. Om du deklarerar att variabeln är Sharedfår alla instanser åtkomst till samma lagringsplats, och om en instans ändrar variabelns värde får alla instanser åtkomst till det uppdaterade värdet.

Delning ändrar inte åtkomstnivån för en medlem. En klassmedlem kan till exempel delas och vara privat (endast tillgänglig från klassen) eller icke-delad och offentlig. Mer information finns i Åtkomstnivåer i Visual Basic.

Regler

  • Deklarationskontext. Du kan bara använda Shared på modulnivå. Det innebär att deklarationskontexten för ett Shared element måste vara en klass eller struktur och får inte vara en källfil, ett namnområde eller en procedur.

  • Kombinerade modifierare. Du kan inte ange Shared tillsammans med åsidosättningar, åsidosättningar, NotOverridable, MustOverride eller Static i samma deklaration.

  • Åtkomst. Du får åtkomst till ett delat element genom att kvalificera det med dess klass- eller strukturnamn, inte med variabelnamnet för en specifik instans av dess klass eller struktur. Du behöver inte ens skapa en instans av en klass eller struktur för att få åtkomst till dess delade medlemmar.

    I följande exempel anropas den delade procedur IsNaN som exponeras av Double strukturen.

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • Implicit delning. Du kan inte använda Shared modifieraren i en Const-instruktion, men konstanter delas implicit. På samma sätt kan du inte deklarera att en medlem i en modul eller ett gränssnitt är Shared, men de delas implicit.

Funktionssätt

  • Lagring. En delad variabel eller händelse lagras bara i minnet en gång, oavsett hur många eller få instanser du skapar av dess klass eller struktur. På samma sätt innehåller en delad procedur eller egenskap bara en uppsättning lokala variabler.

  • Åtkomst via en instansvariabel. Det går att komma åt ett delat element genom att kvalificera det med namnet på en variabel som innehåller en specifik instans av dess klass eller struktur. Även om detta vanligtvis fungerar som förväntat genererar kompilatorn ett varningsmeddelande och ger åtkomst via klass- eller strukturnamnet i stället för variabeln.

  • Åtkomst via ett instansuttryck. Om du kommer åt ett delat element via ett uttryck som returnerar en instans av dess klass eller struktur, gör kompilatorn åtkomsten via klass- eller strukturnamnet i stället för att utvärdera uttrycket. Den här åtkomsten ger oväntade resultat om du avsåg att uttrycket skulle utföra andra åtgärder och returnera instansen. I följande exempel visas den här situationen.

    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
    

    I föregående exempel genererar kompilatorn ett varningsmeddelande båda gångerna koden kommer åt den delade egenskapen Total via en instans. I varje fall gör den åtkomsten direkt via klassen ShareTotal och använder inte någon instans. När det gäller det avsedda anropet till proceduren ReturnClassinnebär det att det inte ens genererar ett anrop till ReturnClass, så den ytterligare åtgärden att visa "Function ReturnClass() called" utförs inte.

Modifieraren Shared kan användas i följande sammanhang:

Se även