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


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

    outerSpaceinnerSpace → → → 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  

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

Оператор Import (пространство имен и тип.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.

См. также