Delen via


Procedure: Een variabele verbergen met dezelfde naam als uw variabele (Visual Basic)

U kunt een variabele verbergen door deze te schaduwen , dat wil gezegd door deze opnieuw te definiëren met een variabele met dezelfde naam. U kunt de variabele die u wilt verbergen op twee manieren schaduw geven:

  • Schaduw door bereik. U kunt het bereik schaduwen door deze opnieuw te declareren in een subregio van de regio met de variabele die u wilt verbergen.

  • Schaduw door overname. Als de variabele die u wilt verbergen, is gedefinieerd op klasseniveau, kunt u deze schaduwen via overname door deze opnieuw te declareren met het trefwoord Schaduwen in een afgeleide klasse.

Twee manieren om een variabele te verbergen

Een variabele verbergen door deze te schaduwen via het bereik

  1. Bepaal de regio die de variabele definieert die u wilt verbergen en bepaal een subregio waarin u deze opnieuw wilt definiëren met uw variabele.

    Regio van variabele Toegestane subregio voor het opnieuw definiëren ervan
    Module Een klasse in de module
    Klas Een subklasse binnen de klasse

    Een procedure binnen de klasse

    U kunt een procedurevariabele niet opnieuw definiëren in een blok binnen die procedure, bijvoorbeeld in een If...End If constructie of een For lus.

  2. Maak de subregio als deze nog niet bestaat.

  3. Schrijf in de subregio een Dim-instructie die de schaduwvariabele declareren.

    Wanneer code in de subregio verwijst naar de naam van de variabele, wordt de verwijzing naar de schaduwvariabele door de compiler omgezet.

    In het volgende voorbeeld ziet u schaduw door het bereik, evenals een verwijzing die de schaduw omzeilt.

    Module shadowByScope
        ' The following statement declares num as a module-level variable.
        Public num As Integer
        Sub show()
            ' The following statement declares num as a local variable.
            Dim num As Integer
            ' The following statement sets the value of the local variable.
            num = 2
            ' The following statement displays the module-level variable.
            MsgBox(CStr(shadowByScope.num))
        End Sub
        Sub useModuleLevelNum()
            ' The following statement sets the value of the module-level variable.
            num = 1
            show()
        End Sub
    End Module
    

    In het voorgaande voorbeeld wordt de variabele num zowel op moduleniveau als op procedureniveau (in de procedure show) gede declareren. De lokale variabele num schaduwt de variabele numshowop moduleniveau, dus de lokale variabele is ingesteld op 2. Er is echter geen lokale variabele voor schaduw num in de useModuleLevelNum procedure. useModuleLevelNum Stelt daarom de waarde van de variabele op moduleniveau in op 1.

    De MsgBox aanroep in de aanroep show omzeilt het schaduwmechanisme door in aanmerking te komen num met de modulenaam. Daarom wordt de variabele op moduleniveau weergegeven in plaats van de lokale variabele.

Een variabele verbergen door deze te schaduwen via overname

  1. Zorg ervoor dat de variabele die u wilt verbergen, is gedeclareerd in een klasse en op klasseniveau (buiten elke procedure). Anders kunt u deze niet schaduwen door overname.

  2. Definieer een klasse die is afgeleid van de klasse van de variabele als deze nog niet bestaat.

  3. Schrijf in de afgeleide klasse een Dim instructie die uw variabele declareren. Neem het trefwoord Schaduwen op in de declaratie.

    Wanneer code in de afgeleide klasse verwijst naar de naam van de variabele, wordt de verwijzing naar uw variabele omgezet door de compiler.

    In het volgende voorbeeld ziet u schaduw door overname. Het maakt twee verwijzingen, een die toegang heeft tot de schaduwvariabele en een die de schaduw omzeilt.

    Public Class shadowBaseClass
        Public shadowString As String = "This is the base class string."
    End Class
    Public Class shadowDerivedClass
        Inherits shadowBaseClass
        Public Shadows shadowString As String = "This is the derived class string."
        Public Sub showStrings()
            Dim s As String = "Unqualified shadowString: " & shadowString &
                 vbCrLf & "MyBase.shadowString: " & MyBase.shadowString
            MsgBox(s)
        End Sub
    End Class
    

    Het voorgaande voorbeeld declareert de variabele shadowString in de basisklasse en schaduwt deze in de afgeleide klasse. De procedure showStrings in de afgeleide klasse geeft de schaduwversie van de tekenreeks weer wanneer de naam shadowString niet is gekwalificeerd. Vervolgens wordt de schaduwversie weergegeven wanneer shadowString deze wordt gekwalificeerd met het MyBase trefwoord.

Robuuste programmering

Schaduwen introduceert meer dan één versie van een variabele met dezelfde naam. Wanneer een code-instructie verwijst naar de naam van de variabele, is de versie waarnaar de compiler de verwijzing oplost afhankelijk van factoren zoals de locatie van de code-instructie en de aanwezigheid van een in aanmerking komende tekenreeks. Dit kan het risico verhogen dat wordt verwezen naar een onbedoelde versie van een schaduwvariabele. U kunt dit risico verlagen door alle verwijzingen naar een schaduwvariabele volledig in aanmerking te komen.

Zie ook