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
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
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.
outerSpace
innerSpace
→ → →holdsTotals
totals
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.
Schrijf de expressie of toewijzingsinstructie die op de normale manier naar het doelelement verwijst.
grandTotal = 9000
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
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.