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 Shared
få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 ettShared
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 ärShared
, 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 klassenShareTotal
och använder inte någon instans. När det gäller det avsedda anropet till procedurenReturnClass
innebär det att det inte ens genererar ett anrop tillReturnClass
, så den ytterligare åtgärden att visa "Function ReturnClass() called" utförs inte.
Modifieraren Shared
kan användas i följande sammanhang: