Odkazy na deklarované elementy (Visual Basic)

Pokud váš kód odkazuje na deklarovaný prvek, kompilátor jazyka Visual Basic odpovídá názvu v odkazu na příslušnou deklaraci tohoto názvu. Pokud je deklarován více než jeden prvek se stejným názvem, můžete určit, na které z těchto prvků se má odkazovat, a to opravňujícím jeho názvem.

Kompilátor se pokusí shodovat s názvem odkazem na deklaraci názvu s nejužším oborem. To znamená, že začíná kódem, který vytváří odkaz, a pracuje směrem ven prostřednictvím po sobě jdoucích úrovní obsahujících prvků.

Následující příklad ukazuje odkazy na dvě proměnné se stejným názvem. Příklad deklaruje dvě proměnné, z nichž každý má název totalCount, na různých úrovních oboru v modulu container. Když se procedura showCount zobrazí totalCount bez kvalifikace, kompilátor jazyka Visual Basic přeloží odkaz na deklaraci s nejužším oborem, a sice místní deklaraci uvnitř showCount. Pokud se kvalifikuje totalCount s modulem obsahujícím container, kompilátor přeloží odkaz na deklaraci s širším rozsahem.

' 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  

Kvalifikace názvu elementu

Pokud chcete tento proces vyhledávání přepsat a zadat název deklarovaný v širším oboru, musíte název kvalifikovat pomocí prvku obsahujícího širší obor. V některých případech může být také nutné kvalifikovat prvek obsahující prvek.

Kvalifikace názvu znamená, že před ním ve zdrojovém příkazu najdete informace, které identifikují, kde je cílový prvek definován. Tyto informace se nazývají řetězec kvalifikace. Může obsahovat jeden nebo více oborů názvů a modul, třídu nebo strukturu.

Řetězec kvalifikace by měl jednoznačně specifikovat modul, třídu nebo strukturu obsahující cílový prvek. Kontejner se může zase nacházet v jiném obsahujícím prvku, obvykle v oboru názvů. V řetězci kvalifikace možná budete muset zahrnout několik prvků obsahujících.

Přístup k deklarovanému prvku opravňujícím jeho názvem

  1. Určete umístění, ve kterém byl prvek definován. Může to zahrnovat obor názvů nebo dokonce hierarchii oborů názvů. V rámci oboru názvů nejnižší úrovně musí být prvek obsažen v modulu, třídě nebo struktuře.

    ' 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. Určete cestu kvalifikace na základě umístění cílového prvku. Začněte oborem názvů nejvyšší úrovně, pokračujte k oboru názvů nejnižší úrovně a končíte modulem, třídou nebo strukturou obsahujícím cílový prvek. Každý prvek v cestě musí obsahovat prvek, který následuje za ním.

    outerSpaceinnerSpace → → → holdsTotalstotals

  3. Připravte řetězec kvalifikace pro cílový prvek. Umístěte tečku (.) za každý prvek v cestě. Vaše aplikace musí mít přístup ke všem prvkům v řetězci kvalifikace.

    outerSpace.innerSpace.holdsTotals.totals.  
    
  4. Napište výraz nebo příkaz přiřazení odkazující na cílový prvek normálním způsobem.

    grandTotal = 9000  
    
  5. Před název cílového elementu zadejte řetězec kvalifikace. Název by měl okamžitě následovat za tečkou (.), která následuje za modulem, třídou nebo strukturou, která obsahuje prvek.

    ' 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. Kompilátor používá řetězec kvalifikace k nalezení jasné, jednoznačné deklarace, ke které může odpovídat odkazu na cílový prvek.

Pokud má vaše aplikace přístup k více programovacím prvkům se stejným názvem, může být také nutné kvalifikovat odkaz na název. Obory názvů například System.Windows.FormsSystem.Web.UI.WebControls obsahují Label třídu (System.Windows.Forms.Label a System.Web.UI.WebControls.Label). Pokud vaše aplikace používá obojí nebo pokud definuje svou vlastní Label třídu, musíte odlišit různé Label objekty. Do deklarace proměnné zahrňte alias oboru názvů nebo importu. Následující příklad používá alias importu.

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

Členy jiných obsahujících prvků

Pokud používáte nesdílený člen jiné třídy nebo struktury, musíte nejprve kvalifikovat název člena pomocí proměnné nebo výrazu, který odkazuje na instanci třídy nebo struktury. V následujícím příkladu demoClass je instance třídy s názvem class1.

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

Název třídy nelze použít k kvalifikaci člena, který není sdílený. Nejprve musíte vytvořit instanci v proměnné objektu (v tomto případě demoClass) a pak na ni odkazovat názvem proměnné.

Pokud má Shared třída nebo struktura člena, můžete kvalifikovat tento člen buď pomocí názvu třídy nebo struktury, nebo s proměnnou nebo výrazem, který odkazuje na instanci.

Modul nemá žádné samostatné instance a všechny jeho členy jsou Shared ve výchozím nastavení. Proto kvalifikujete člena modulu s názvem modulu.

Následující příklad ukazuje kvalifikované odkazy na procedury členů modulu. Příklad deklaruje dva Sub postupy, oba pojmenované perform, v různých modulech v projektu. Každý z nich lze zadat bez kvalifikace v rámci vlastního modulu, ale musí být kvalifikovaný, pokud se odkazuje z libovolného jiného místa. Vzhledem k tomu, že konečný odkaz není module3 kvalifikován perform, kompilátor nemůže tento odkaz přeložit.

' 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  

Odkazy na projekty

Chcete-li použít veřejné prvky definované v jiném projektu, musíte nejprve nastavit odkaz na sestavení nebo knihovnu typů daného projektu. Chcete-li nastavit odkaz, klepněte na tlačítko Přidat odkaz v nabídce Projektu nebo použijte možnost kompilátoru příkazového řádku -reference (Visual Basic ).

Můžete například použít objektový model XML rozhraní .NET Framework. Pokud nastavíte odkaz na System.Xml obor názvů, můžete deklarovat a používat některou z jejích tříd, například XmlDocument. Následující příklad používá 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  

Import obsahující prvky

Příkaz Imports (obor názvů a typ .NET) můžete použít k importu oborů názvů obsahujících moduly nebo třídy, které chcete použít. Díky tomu můžete odkazovat na prvky definované v importovaném oboru názvů, aniž byste plně opravili jejich názvy. Následující příklad přepíše předchozí příklad pro import System.Xml oboru názvů.

' 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  

Kromě toho Imports může příkaz definovat alias importu pro každý importovaný obor názvů. Díky tomu může být zdrojový kód kratší a čitelnější. Následující příklad přepíše předchozí příklad tak, aby se použil xD jako alias oboru System.Xml názvů.

' 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  

Příkaz Imports nedává prvky z jiných projektů k dispozici pro vaši aplikaci. To znamená, že nenastaví odkaz. Import oboru názvů jenom odebere požadavek na kvalifikaci názvů definovaných v daném oboru názvů.

Tento příkaz můžete použít také k importu Imports modulů, tříd, struktur a výčtů. Potom můžete použít členy těchto importovaných prvků bez kvalifikace. Vždy však musíte opravovat nesdílené členy tříd a struktur pomocí proměnné nebo výrazu, který se vyhodnotí jako instance třídy nebo struktury.

Pokyny k pojmenování

Když definujete dva nebo více programovacích prvků se stejným názvem, může mít za následek nejednoznačnost názvu, když se kompilátor pokusí přeložit odkaz na tento název. Pokud je v oboru více než jedna definice nebo pokud není v oboru žádná definice, odkaz je nespravitelný. Příklad najdete v části Kvalifikovaný příklad odkazu na této stránce nápovědy.

Nejednoznačnost názvu se můžete vyhnout tím, že všem prvkům udělíte jedinečné názvy. Pak můžete odkazovat na jakýkoli prvek, aniž byste museli kvalifikovat jeho název pomocí oboru názvů, modulu nebo třídy. Snížíte také pravděpodobnost náhodného odkazování na nesprávný prvek.

Stínování

Když dva programovací prvky sdílejí stejný název, jeden z nich může skrýt nebo stín, druhý z nich. Stínovaný prvek není k dispozici pro referenci; Místo toho, pokud váš kód používá název stínovaného elementu, kompilátor jazyka Visual Basic jej přeloží na stínovací prvek. Podrobnější vysvětlení s příklady najdete v tématu Stínování v jazyce Visual Basic.

Viz také