Поделиться через


Ссылки на объявленные элементы (Visual Basic)

Когда ваш код ссылается на объявленный элемент, компилятор Visual Basic сопоставляет имя ссылки с соответствующим объявлением этого имени. Если несколько элементов объявлены с тем же именем, вы можете контролировать, к какому из этих элементов следует обращаться, уточняя его имя.

Компилятор пытается сопоставить ссылку на имя с объявлением имени в самой узкой области видимости. Это означает, что он начинается с делающего ссылку кода и поочередно работает через уровни, содержащие элементы.

В следующем примере показаны ссылки на две переменные с одинаковым именем. В примере объявляются две переменные, каждая из которых называется totalCount, на разных уровнях области в модуле container. Когда процедура showCount отображается totalCount без квалификации, компилятор Visual Basic разрешает ссылку на объявление с самой узкой областью, а именно локальное объявление внутри showCount. При квалификации totalCount с помощью содержащего модуля container компилятор разрешает ссылку на объявление в более широком контексте.

' 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  

Определение имени элемента

Если вы хотите переопределить этот процесс поиска и указать имя, объявленное в более широкой области, необходимо указать имя с содержащим элементом более широкой области. В некоторых случаях может потребоваться также квалифицировать содержащий элемент.

Определение имени означает, что перед ним в исходной инструкции содержатся сведения, определяющие, где определен целевой элемент. Эта информация называется строкой квалификации. Он может включать одно или несколько пространств имен и модуль, класс или структуру.

Строка квалификации должна однозначно указать модуль, класс или структуру, содержащую целевой элемент. Контейнер, в свою очередь, может находиться в другом содержащем элементе, обычно пространстве имен. Вам, возможно, придется включить несколько элементов, содержащихся в квалификационной строке.

Доступ к объявленному элементу путем указания его имени

  1. Определите расположение, в котором был определен элемент. Это может включать пространство имен или даже иерархию пространств имен. В пространстве имен самого низкого уровня элемент должен содержаться в модуле, классе или структуре.

    ' 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. Определите путь квалификации на основе расположения целевого элемента. Начните с пространства имен верхнего уровня, перейдите к пространству имен самого низкого уровня и завершите его модулем, классом или структурой, содержащей целевой элемент. Каждый элемент в пути должен содержать элемент, следующий за ним.

    outerSpace innerSpace → → → holdsTotalstotals

  3. Подготовьте строку квалификации для целевого элемента. Ставьте точку (.) после каждого элемента в пути. Приложение должно иметь доступ к каждому элементу в строке квалификации.

    outerSpace.innerSpace.holdsTotals.totals.  
    
  4. Напишите выражение или инструкцию назначения, ссылающуюся на целевой элемент обычным образом.

    grandTotal = 9000  
    
  5. Перед именем целевого элемента укажите строку квалификации. Имя должно немедленно следовать за периодом (.), следующим за модулем, классом или структурой, содержащей элемент.

    ' 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. Компилятор использует строку квалификации для поиска четкого и однозначного объявления, с которым он может соотнести ссылку на целевой элемент.

Кроме того, может потребоваться указать ссылку на имя, если у приложения есть доступ к нескольким элементам программирования с одинаковым именем. Например, System.Windows.FormsSystem.Web.UI.WebControls пространства имен содержат Label класс (System.Windows.Forms.Label и System.Web.UI.WebControls.Label). Если приложение использует оба или определяет свой собственный Label класс, необходимо различать различные Label объекты. Включите пространство имен и псевдоним импорта в объявление переменной. В следующем примере используется псевдоним для импорта.

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

Элементы из других содержащих структур

При использовании не разделяемого элемента другого класса или структуры вы должны сначала указать имя элемента с помощью переменной или выражения, которые ссылаются на экземпляр этого класса или структуры. В следующем примере demoClass используется экземпляр класса с именем class1.

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

Нельзя использовать само имя класса для квалификации члена, который не является общим. Сначала необходимо создать экземпляр в переменной объекта (в данном случае demoClass), а затем ссылаться на нее по имени переменной.

Если у класса или структуры есть Shared член, этот член можно квалифицировать либо с именем класса или структуры, либо с переменной или выражением, указывающим на экземпляр.

Модуль не имеет отдельных экземпляров, и все его члены используются по умолчанию в Shared. Поэтому вы определяете элемент модуля по имени модуля.

В следующем примере показаны квалифицированные ссылки на методы членов модуля. В примере объявляются две Sub процедуры с одинаковым именем perform в разных модулях проекта. Каждый из них может быть указан без квалификации в собственном модуле, но должен быть квалифицирован, если он указан в любом другом месте. Поскольку последняя ссылка в module3 не квалифицирует perform, компилятор не может разрешить эту ссылку.

' 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  

Ссылки на проекты

Чтобы использовать открытые элементы, определенные в другом проекте, необходимо сначала задать ссылку на сборку или библиотеку типов этого проекта. Чтобы задать ссылку, нажмите кнопку "Добавить ссылку " в меню "Проект " или используйте параметр компилятора командной строки -reference (Visual Basic ).

Например, можно использовать объектную модель XML платформы .NET Framework. Если вы задаете ссылку на System.Xml пространство имен, можно объявить и использовать любой из его классов, например XmlDocument. В следующем примере используется 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  

Импорт содержащих элементов

Вы можете использовать оператор Imports (.NET пространства имен и типа) для импорта пространств имен, содержащих модули или классы, которые вы хотите использовать. Это позволяет ссылаться на элементы, определенные в импортированном пространстве имен, без полного определения их имен. В следующем примере предыдущий пример переписывается для импорта пространства имен System.Xml.

' 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  

Кроме того, Imports инструкция может определить псевдоним импорта для каждого импортированного пространства имен. Это может сделать исходный код более коротким и удобным для чтения. В следующем примере предыдущий пример переписывается, чтобы использовать xD в качестве алиаса для пространства имен System.Xml.

' 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  

Оператор Imports не делает элементы из других проектов доступными для приложения. То есть это не заменяет установку справочной ссылки. При импорте пространства имен просто удаляется требование квалифицировать имена, определенные в этом пространстве имен.

Инструкцию Imports можно также использовать для импорта модулей, классов, структур и перечислений. Затем можно использовать компоненты таких импортированных элементов без дополнительной квалификации. Тем не менее, всегда необходимо квалифицировать необщие члены классов и структур с помощью переменной или выражения, которое оценивается как экземпляр класса или структуры.

Рекомендации по именованию

При определении двух или более программных элементов с одинаковым именем, может возникнуть неоднозначность имени при попытке компилятора разрешить ссылку на это имя. Если в области видимости находится несколько определений или если определение не находится в области видимости, ссылка неразрешима. Пример см. в разделе "Пример квалифицированной ссылки" на этой странице справки.

Вы можете избежать неоднозначности имен, предоставив всем элементам уникальные имена. Затем вы можете ссылаться на любой элемент, не имея необходимости квалифицировать его имя с пространством имен, модулем или классом. Вы также снижаете вероятность случайного обращения к неправильному элементу.

Затенение

Если два элемента программирования имеют одно и то же имя, один из них может скрыть или затенить другой. Теневой элемент недоступен для ссылки; вместо этого, когда ваш код использует имя теневого элемента, компилятор Visual Basic связывает его с элементом, который его скрывает. Более подробное описание примеров см. в разделе "Тени" в Visual Basic.

См. также