Share via


Referenser till deklarerade element (Visual Basic)

När koden refererar till ett deklarerat element matchar Visual Basic-kompilatorn namnet i din referens till lämplig deklaration av det namnet. Om fler än ett element deklareras med samma namn kan du styra vilket av dessa element som ska refereras genom att kvalificera dess namn.

Kompilatorn försöker matcha en namnreferens till en namndeklaration med det smalaste omfånget. Det innebär att den börjar med koden som gör referensen och fungerar utåt genom efterföljande nivåer av innehållande element.

I följande exempel visas referenser till två variabler med samma namn. I exemplet deklareras två variabler, var och en med namnet totalCount, på olika omfångsnivåer i modulen container. När proceduren showCount visas totalCount utan kvalificering löser Visual Basic-kompilatorn referensen till deklarationen med det smalaste omfånget, nämligen den lokala deklarationen i showCount. När den kvalificerar totalCount sig för den innehållande modulen containerlöser kompilatorn referensen till deklarationen med det bredare omfånget.

' 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  

Kvalificera ett elementnamn

Om du vill åsidosätta den här sökprocessen och ange ett namn som deklarerats i ett bredare omfång måste du kvalificera namnet med det innehållande elementet i det bredare omfånget. I vissa fall kan du också behöva kvalificera det innehållande elementet.

Att kvalificera ett namn innebär att du föregår det i källinstrukeringen med information som identifierar var målelementet definieras. Den här informationen kallas för en kvalificeringssträng. Den kan innehålla en eller flera namnområden och en modul, klass eller struktur.

Kvalificeringssträngen bör entydigt ange den modul, klass eller struktur som innehåller målelementet. Containern kan i sin tur finnas i ett annat innehållande element, vanligtvis ett namnområde. Du kan behöva inkludera flera innehållande element i kvalificeringssträngen.

För att få åtkomst till ett deklarerat element genom att kvalificera dess namn

  1. Fastställa platsen där elementet har definierats. Detta kan omfatta ett namnområde eller till och med en hierarki med namnområden. I namnområdet på den lägsta nivån måste elementet finnas i en modul, klass eller struktur.

    ' 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. Fastställa en kvalificeringssökväg baserat på målelementets plats. Börja med namnområdet på den högsta nivån, fortsätt till namnområdet på den lägsta nivån och avsluta med modulen, klassen eller strukturen som innehåller målelementet. Varje element i sökvägen måste innehålla elementet som följer det.

    outerSpaceinnerSpace → → holdsTotalstotals

  3. Förbered kvalificeringssträngen för målelementet. Placera en punkt (.) efter varje element i sökvägen. Ditt program måste ha åtkomst till varje element i din kvalificeringssträng.

    outerSpace.innerSpace.holdsTotals.totals.  
    
  4. Skriv uttrycket eller tilldelningsuttrycket som refererar till målelementet på normalt sätt.

    grandTotal = 9000  
    
  5. Föregå målelementnamnet med kvalificeringssträngen. Namnet bör omedelbart följa den punkt (.) som följer modulen, klassen eller strukturen som innehåller elementet.

    ' 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. Kompilatorn använder kvalificeringssträngen för att hitta en tydlig, entydig deklaration som den kan matcha målelementreferensen till.

Du kan också behöva kvalificera en namnreferens om ditt program har åtkomst till fler än ett programmeringselement som har samma namn. Till exempel System.Windows.Forms innehåller namnrymderna och System.Web.UI.WebControls båda en Label klass (System.Windows.Forms.Label och System.Web.UI.WebControls.Label). Om programmet använder båda, eller om det definierar sin egen Label klass, måste du skilja mellan de olika Label objekten. Inkludera namnområdet eller importaliaset i variabeldeklarationen. I följande exempel används importaliaset.

' 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()  

Medlemmar i andra innehållande element

När du använder en icke-delad medlem i en annan klass eller struktur måste du först kvalificera medlemsnamnet med en variabel eller ett uttryck som pekar på en instans av klassen eller strukturen. I följande exempel demoClass är en instans av en klass med namnet class1.

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

Du kan inte använda själva klassnamnet för att kvalificera en medlem som inte är delad. Du måste först skapa en instans i en objektvariabel (i det här fallet demoClass) och sedan referera till den med variabelnamnet.

Om en klass eller struktur har en Shared medlem kan du kvalificera medlemmen med antingen klass- eller strukturnamnet eller med en variabel eller ett uttryck som pekar på en instans.

En modul har inga separata instanser och alla dess medlemmar är Shared som standard. Därför kvalificerar du en modulmedlem med modulnamnet.

I följande exempel visas kvalificerade referenser till modulmedlemsprocedurer. I exemplet deklareras två Sub procedurer, båda med namnet perform, i olika moduler i ett projekt. Var och en kan anges utan kvalificering i sin egen modul men måste vara kvalificerad om den refereras från någon annanstans. Eftersom den slutliga referensen i module3 inte är berättigad performkan kompilatorn inte matcha den referensen.

' 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  

Referenser till projekt

Om du vill använda offentliga element som definierats i ett annat projekt måste du först ange en referens till projektets sammansättning eller typbibliotek. Om du vill ange en referens klickar du på Lägg till referensProjekt-menyn eller använder kommandoradskompileraralternativet -reference (Visual Basic ).

Du kan till exempel använda XML-objektmodellen för .NET Framework. Om du anger en referens till namnområdet kan du deklarera och använda någon av dess klasser, till System.Xml exempel XmlDocument. I följande exempel används 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  

Importera innehållande element

Du kan använda importinstruktionen (.NET-namnområde och typ) för att importera de namnområden som innehåller de moduler eller klasser som du vill använda. På så sätt kan du referera till de element som definierats i ett importerat namnområde utan att fullständigt kvalificera deras namn. I följande exempel skrivs det tidigare exemplet om för att importera System.Xml namnområdet.

' 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  

Dessutom kan instruktionen Imports definiera ett importalias för varje importerat namnområde. Detta kan göra källkoden kortare och enklare att läsa. I följande exempel skrivs det tidigare exemplet om så att det används xD som ett alias för System.Xml namnområdet.

' 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  

Instruktionen Imports gör inte element från andra projekt tillgängliga för ditt program. Det innebär att den inte ersätter att ange en referens. När du importerar ett namnområde tar du bort kravet på att kvalificera namnen som definierats i namnområdet.

Du kan också använda -instruktionen Imports för att importera moduler, klasser, strukturer och uppräkningar. Du kan sedan använda medlemmarna i sådana importerade element utan kvalificering. Du måste dock alltid kvalificera icke-delade medlemmar i klasser och strukturer med en variabel eller ett uttryck som utvärderas till en instans av klassen eller strukturen.

Riktlinjer för namngivning

När du definierar två eller flera programmeringselement som har samma namn kan en namnambiguitet uppstå när kompilatorn försöker matcha en referens till det namnet. Om mer än en definition finns i omfånget, eller om ingen definition finns i omfånget, är referensen olöslig. Ett exempel finns i "Exempel på kvalificerad referens" på den här hjälpsidan.

Du kan undvika tvetydiga namn genom att ge alla element unika namn. Sedan kan du referera till ett element utan att behöva kvalificera dess namn med ett namnområde, en modul eller en klass. Du minskar också risken för att oavsiktligt referera till fel element.

Skuggning

När två programmeringselement har samma namn kan den ena dölja eller skugga den andra. Ett skuggat element är inte tillgängligt som referens. I stället, när koden använder det skuggade elementnamnet, löser Visual Basic-kompilatorn det till skuggelementet. En mer detaljerad förklaring med exempel finns i Skuggning i Visual Basic.

Se även