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


Ссылки на объявленные элементы (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 → holdsTotals → totals

  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.Forms и System.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)]

Нельзя использовать имя самого класса для уточнения члена, который не является Shared (Visual Basic).Необходимо сначала создать экземпляр в переменной объекта (в этом случае 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

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

Для использования элементов Public (Visual Basic), описанных в другом проекте, нужно сначала задать ссылку на сборку или библиотеку типов этого проекта.Чтобы установить ссылку, нажмите кнопку добавить ссылку в меню Проект или используйте параметры командной строки компилятора /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.

См. также

Задачи

Практическое руководство. Изменение свойств проекта и параметров конфигурации

Ссылки

Оператор Imports (пространство имен .NET и тип)

Оператор New (Visual Basic)

Public (Visual Basic)

Основные понятия

Имена объявленных типов (Visual Basic)

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

Переменные в Visual Basic