Delen via


Gedeeld (Visual Basic)

Hiermee geeft u op dat een of meer gedeclareerde programmeerelementen zijn gekoppeld aan een klasse of structuur, en niet met een specifiek exemplaar van de klasse of structuur.

Wanneer gedeeld gebruiken

Als u een lid van een klasse of structuur deelt, is deze beschikbaar voor elk exemplaar, in plaats van niet-gedeeld, waarbij elk exemplaar een eigen kopie bewaart. Delen is bijvoorbeeld handig als de waarde van een variabele van toepassing is op de hele toepassing. Als u deze variabele Shareddeclareert, hebben alle exemplaren toegang tot dezelfde opslaglocatie en als één exemplaar de waarde van de variabele wijzigt, krijgen alle exemplaren toegang tot de bijgewerkte waarde.

Delen wijzigt het toegangsniveau van een lid niet. Een klaslid kan bijvoorbeeld worden gedeeld en privé (alleen toegankelijk vanuit de klas) of niet-gedeeld en openbaar. Zie Access-niveaus in Visual Basic voor meer informatie.

Regels

  • Declaratiecontext. U kunt alleen op moduleniveau gebruiken Shared . Dit betekent dat de declaratiecontext voor een Shared element een klasse of structuur moet zijn en geen bronbestand, naamruimte of procedure kan zijn.

  • Gecombineerde modifiers. U kunt niet opgeven Shared samen met onderdrukkingen, overschrijfbaar, notoverridable, MustOverride of statisch in dezelfde declaratie.

  • Toegang krijgen tot. U opent een gedeeld element door het te kwalificeren met de klasse- of structuurnaam, niet met de variabelenaam van een specifiek exemplaar van de klasse of structuur. U hoeft zelfs geen exemplaar van een klasse of structuur te maken voor toegang tot de gedeelde leden.

    In het volgende voorbeeld wordt de gedeelde procedure IsNaN aangeroepen die door de Double structuur wordt weergegeven.

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • Impliciet delen. U kunt de Shared wijzigingsfunctie niet gebruiken in een Const-instructie, maar constanten worden impliciet gedeeld. Op dezelfde manier kunt u geen lid van een module of een interface declareren, Sharedmaar ze worden impliciet gedeeld.

Gedrag

  • Opslag. Een gedeelde variabele of gebeurtenis wordt slechts eenmaal in het geheugen opgeslagen, ongeacht hoeveel of weinig exemplaren u maakt van de klasse of structuur. Op dezelfde manier bevat een gedeelde procedure of eigenschap slechts één set lokale variabelen.

  • Toegang tot een exemplaarvariabele. Het is mogelijk om toegang te krijgen tot een gedeeld element door het te kwalificeren met de naam van een variabele die een specifiek exemplaar van de klasse of structuur bevat. Hoewel dit meestal werkt zoals verwacht, genereert de compiler een waarschuwingsbericht en maakt de toegang via de klasse- of structuurnaam in plaats van de variabele.

  • Toegang tot een exemplaarexpressie. Als u een gedeeld element opent via een expressie die een exemplaar van de klasse of structuur retourneert, maakt de compiler de toegang via de klasse- of structuurnaam in plaats van de expressie te evalueren. Deze toegang levert onverwachte resultaten op als u de expressie hebt bedoeld om andere acties uit te voeren en het exemplaar te retourneren. In het volgende voorbeeld ziet u deze situatie.

    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
    

    In het voorgaande voorbeeld genereert de compiler beide keren een waarschuwingsbericht dat de code toegang heeft tot de gedeelde eigenschap Total via een exemplaar. In elk geval wordt de toegang rechtstreeks via de klasse ShareTotal uitgevoerd en wordt er geen gebruikgemaakt van een exemplaar. In het geval van de beoogde aanroep van de procedure ReturnClass, betekent dit dat het niet eens een aanroep naar ReturnClassgenereert, zodat de extra actie voor het weergeven van "Function ReturnClass() aangeroepen" niet wordt uitgevoerd.

De Shared wijzigingsfunctie kan in deze contexten worden gebruikt:

Zie ook