Ссылки на объявленные элементы (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
Уточнение имени элемента
Если требуется переопределить этот процесс поиска и задать имя, объявленное в более широкой области, необходимо уточнить имя содержащим элементом более широкой области. В некоторых случаях также, возможно, придется уточнять содержащий элемент.
Уточнение имени означает нахождение сведений в исходном операторе кода, которые указывают, где определен целевой элемент. Эта информация называется уточняющей строкой. Она может включать одно или несколько пространств имен и модулей, классов или структур.
Уточняющая строка должна однозначно указать модуль, класс или структуру, в которой содержится конечный элемент. Контейнер может, в свою очередь, находится в другом вмещающем элементе, обычно в пространстве имен. Может потребоваться включить несколько элементов в уточняющую строку.
Доступ к объявленному элементу с уточнением его имени |
|
Также, возможно, придется уточнять ссылки на имена, если приложение имеет доступ более чем к одному элементу программирования, который имеет то же имя. Например, пространства имен System.Windows.Forms и System.Web.UI.WebControls содержат классы Label (Label и 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 и тип)
Основные понятия
Имена объявленных типов (Visual Basic)