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


Разрешение ссылки, когда несколько переменных имеют одинаковые имена

Обновлен: Ноябрь 2007

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

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

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

Самая узкая область

В следующем примере показаны ссылки на две переменные с одним и тем же именем.

' 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

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

Члены других содержащих элементов

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

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

Нельзя использовать имя самого класса для уточнения члена, который не является Shared (Visual Basic). Необходимо сначала создать экземпляр в переменной объекта (в этом случае demoClass) и затем сослаться на него, используя имя переменной.

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

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

Пример уточненной ссылки

В следующем примере показаны уточненные ссылки на процедуры члена модуля.

' 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

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

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

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

Классы с одинаковым именем

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

Правила именования

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

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

См. также

Задачи

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

Практическое руководство. Уточнение имени объявляемого элемента

Практическое руководство. Различение двух элементов с одинаковыми именами

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

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

Ссылки

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

New (Visual Basic)

Public (Visual Basic)

Другие ресурсы

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