Delen via


Verwijzingen naar gedeclareerde elementen (Visual Basic)

Wanneer uw code verwijst naar een gedeclareerd element, komt de Visual Basic-compiler overeen met de naam in uw verwijzing naar de juiste declaratie van die naam. Als meer dan één element met dezelfde naam wordt gedeclareerd, kunt u bepalen naar welke van deze elementen moet worden verwezen door de naam ervan te kwalificeren .

De compiler probeert een naamreferentie te koppelen aan een naamdeclaratie met het kleinste bereik. Dit betekent dat deze begint met de code die de verwijzing maakt en naar buiten gaat via opeenvolgende niveaus van het bevatten van elementen.

In het volgende voorbeeld ziet u verwijzingen naar twee variabelen met dezelfde naam. Het voorbeeld declareert twee variabelen, elk benoemd totalCount, op verschillende bereikniveaus in de module container. Wanneer de procedure showCount zonder kwalificatie wordt weergegeven totalCount , wordt met de Visual Basic-compiler de verwijzing naar de declaratie opgelost met het kleinste bereik, namelijk de lokale declaratie binnen showCount. Wanneer deze in aanmerking komt totalCount voor de betreffende module container, lost de compiler de verwijzing naar de declaratie op met het bredere bereik.

' Assume these two modules are both in the same assembly.  
Module container  
    Public totalCount As Integer = 1  
    Public Sub showCount()  
        Dim totalCount As Integer = 6000  
        ' The following statement displays the local totalCount (6000).  
        MsgBox("Unqualified totalCount is " & CStr(totalCount))  
        ' The following statement displays the module's totalCount (1).  
        MsgBox("container.totalCount is " & CStr(container.totalCount))  
    End Sub  
End Module  
Module callingModule  
    Public Sub displayCount()  
        container.showCount()  
        ' The following statement displays the containing module's totalCount (1).  
        MsgBox("container.totalCount is " & CStr(container.totalCount))  
    End Sub  
End Module  

Een elementnaam kwalificeren

Als u dit zoekproces wilt overschrijven en een naam wilt opgeven die is gedeclareerd in een breder bereik, moet u de naam kwalificeren met het element dat het bredere bereik bevat. In sommige gevallen moet u mogelijk ook het element in aanmerking komen.

Als u een naam in aanmerking neemt, betekent dit dat u deze in uw broninstructie plaatst met informatie die aangeeft waar het doelelement is gedefinieerd. Deze informatie wordt een kwalificatietekenreeks genoemd. Het kan een of meer naamruimten en een module, klasse of structuur bevatten.

De kwalificatietekenreeks moet ondubbelzinnig de module, klasse of structuur opgeven die het doelelement bevat. De container kan zich op zijn beurt in een ander element bevinden, meestal een naamruimte. Mogelijk moet u verschillende elementen in de kwalificatietekenreeks opnemen.

Toegang krijgen tot een gedeclareerd element door de naam ervan te kwalificeren

  1. Bepaal de locatie waar het element is gedefinieerd. Dit kan een naamruimte of zelfs een hiërarchie van naamruimten zijn. Binnen de naamruimte op het laagste niveau moet het element zijn opgenomen in een module, klasse of structuur.

    ' Assume the following hierarchy exists outside your code.  
    Namespace outerSpace  
        Namespace innerSpace  
            Module holdsTotals  
                Public Structure totals  
                    Public thisTotal As Integer  
                    Public Shared grandTotal As Long  
                End Structure  
            End Module  
        End Namespace  
    End Namespace  
    
  2. Bepaal een kwalificatiepad op basis van de locatie van het doelelement. Begin met de naamruimte op het hoogste niveau, ga verder met de naamruimte op het laagste niveau en eindig met de module, klasse of structuur die het doelelement bevat. Elk element in het pad moet het volgende element bevatten.

    outerSpaceinnerSpace → → → holdsTotalstotals

  3. Bereid de kwalificatietekenreeks voor op het doelelement. Plaats een punt (.) na elk element in het pad. Uw toepassing moet toegang hebben tot elk element in uw kwalificatietekenreeks.

    outerSpace.innerSpace.holdsTotals.totals.  
    
  4. Schrijf de expressie of toewijzingsinstructie die op de normale manier naar het doelelement verwijst.

    grandTotal = 9000  
    
  5. Geef de naam van het doelelement vooraf aan de kwalificatietekenreeks. De naam moet onmiddellijk volgen op de punt (.) die volgt op de module, klasse of structuur die het element bevat.

    ' Assume the following module is part of your code.  
    Module accessGrandTotal  
        Public Sub setGrandTotal()  
            outerSpace.innerSpace.holdsTotals.totals.grandTotal = 9000  
        End Sub  
    End Module  
    
  6. De compiler gebruikt de kwalificatietekenreeks om een duidelijke, ondubbelzinnige verklaring te vinden waarmee deze overeenkomt met de referentie van het doelelement.

Mogelijk moet u ook een naamreferentie kwalificeren als uw toepassing toegang heeft tot meer dan één programmeerelement met dezelfde naam. De naamruimten en naamruimten bevatten bijvoorbeeld System.Windows.Forms beide een Label klasse (System.Windows.Forms.LabelenSystem.Web.UI.WebControls.Label).System.Web.UI.WebControls Als uw toepassing beide gebruikt of als deze een eigen Label klasse definieert, moet u de verschillende Label objecten onderscheiden. Neem de naamruimte of importalias op in de variabeledeclaratie. In het volgende voorbeeld wordt de importalias gebruikt.

' The following statement must precede all your declarations.  
Imports win = System.Windows.Forms, web = System.Web.UI.WebControls  
' The following statement references the Windows.Forms.Label class.  
Dim winLabel As New win.Label()  

Leden van andere elementen

Wanneer u een niet-gedeeld lid van een andere klasse of structuur gebruikt, moet u eerst de lidnaam kwalificeren met een variabele of expressie die verwijst naar een exemplaar van de klasse of structuur. In het volgende voorbeeld demoClass is dit een exemplaar van een klasse met de naam class1.

Dim demoClass As class1 = New class1()  
demoClass.someSub[(argumentlist)]  

U kunt de klassenaam zelf niet gebruiken om een lid te kwalificeren dat niet gedeeld is. U moet eerst een exemplaar maken in een objectvariabele (in dit geval demoClass) en deze vervolgens verwijzen naar de naam van de variabele.

Als een klasse of structuur een Shared lid heeft, kunt u dat lid kwalificeren met de naam van de klasse of structuur of met een variabele of expressie die verwijst naar een exemplaar.

Een module heeft geen afzonderlijke exemplaren en alle bijbehorende leden zijn Shared standaard. Daarom kwalificeren u een modulelid met de naam van de module.

In het volgende voorbeeld ziet u gekwalificeerde verwijzingen naar procedures voor moduleleden. In het voorbeeld worden twee Sub procedures, beide benoemd perform, in verschillende modules in een project declareren. Elke module kan worden opgegeven zonder kwalificatie binnen een eigen module, maar moet worden gekwalificeerd als er ergens anders naar wordt verwezen. Omdat de uiteindelijke verwijzing module3 niet in aanmerking komt perform, kan de compiler die verwijzing niet oplossen.

' Assume these three modules are all in the same assembly.  
Module module1  
    Public Sub perform()  
        MsgBox("module1.perform() now returning")  
    End Sub  
End Module  
Module module2  
    Public Sub perform()  
        MsgBox("module2.perform() now returning")  
    End Sub  
    Public Sub doSomething()  
        ' The following statement calls perform in module2, the active module.  
        perform()  
        ' The following statement calls perform in module1.  
        module1.perform()  
    End Sub  
End Module  
Module module3  
    Public Sub callPerform()  
        ' The following statement calls perform in module1.  
        module1.perform()  
        ' The following statement makes an unresolvable name reference  
        ' and therefore generates a COMPILER ERROR.  
        perform() ' INVALID statement  
    End Sub  
End Module  

Verwijzingen naar projecten

Als u openbare elementen wilt gebruiken die zijn gedefinieerd in een ander project, moet u eerst een verwijzing instellen naar de assembly- of typebibliotheek van dat project. Als u een verwijzing wilt instellen, klikt u op Verwijzing toevoegen in het menu Project of gebruikt u de opdrachtregelcompileroptie -reference (Visual Basic ).

U kunt bijvoorbeeld het XML-objectmodel van .NET Framework gebruiken. Als u een verwijzing naar de System.Xml naamruimte instelt, kunt u een van de bijbehorende klassen declareren en gebruiken, zoals XmlDocument. In het volgende voorbeeld wordt gebruikgemaakt van XmlDocument.

' Assume this project has a reference to System.Xml  
' The following statement creates xDoc as an XML document object.  
Dim xDoc As System.Xml.XmlDocument  

Importeren met elementen

U kunt de importinstructie (.NET-naamruimte en -type) gebruiken om de naamruimten te importeren die de modules of klassen bevatten die u wilt gebruiken. Hiermee kunt u verwijzen naar de elementen die zijn gedefinieerd in een geïmporteerde naamruimte zonder dat ze volledig in aanmerking komen voor hun namen. In het volgende voorbeeld wordt het vorige voorbeeld herschreven om de System.Xml naamruimte te importeren.

' Assume this project has a reference to System.Xml  
' The following statement must precede all your declarations.  
Imports System.Xml  
' The following statement creates xDoc as an XML document object.  
Dim xDoc As XmlDocument  

Daarnaast kan de Imports instructie een importalias definiëren voor elke geïmporteerde naamruimte. Hierdoor kan de broncode korter en gemakkelijker te lezen zijn. In het volgende voorbeeld wordt het vorige voorbeeld herschreven om te gebruiken xD als alias voor de System.Xml naamruimte.

' Assume this project has a reference to System.Xml  
' The following statement must precede all your declarations.  
Imports xD = System.Xml  
' The following statement creates xDoc as an XML document object.  
Dim xDoc As xD.XmlDocument  

De Imports instructie maakt geen elementen van andere projecten beschikbaar voor uw toepassing. Dat wil gezegd, het is niet de plaats van het instellen van een verwijzing. Als u een naamruimte importeert, hoeft u alleen de namen te kwalificeren die in die naamruimte zijn gedefinieerd.

U kunt de Imports instructie ook gebruiken om modules, klassen, structuren en opsommingen te importeren. Vervolgens kunt u de leden van dergelijke geïmporteerde elementen zonder kwalificatie gebruiken. U moet echter altijd niet-gedeelde leden van klassen en structuren kwalificeren met een variabele of expressie die resulteert in een instantie van de klasse of structuur.

Naamgevingsrichtlijnen

Wanneer u twee of meer programmeerelementen met dezelfde naam definieert, kan een dubbelzinnigheid van een naam resulteren wanneer de compiler probeert een verwijzing naar die naam op te lossen. Als meer dan één definitie binnen het bereik valt of als er geen definitie binnen het bereik valt, is de verwijzing onherstelbaar. Zie 'Voorbeeld van gekwalificeerde referentie' op deze Help-pagina voor een voorbeeld.

U kunt dubbelzinnigheid van namen voorkomen door al uw elementen unieke namen te geven. Vervolgens kunt u verwijzen naar elk element zonder de naam ervan te hoeven kwalificeren met een naamruimte, module of klasse. U vermindert ook de kans om per ongeluk naar het verkeerde element te verwijzen.

Schaduw

Wanneer twee programmeerelementen dezelfde naam hebben, kan een van deze elementen de andere verbergen of schaduwen. Er is geen schaduwelement beschikbaar ter referentie; Wanneer in uw code de naam van het schaduwelement wordt gebruikt, wordt deze door de Visual Basic-compiler omgezet in het schaduwelement. Zie Schaduwen in Visual Basic voor een gedetailleerdere uitleg met voorbeelden.

Zie ook