对已声明元素的引用 (Visual Basic)

当代码引用已声明的元素时,Visual Basic 编译器会将引用中的名称与该名称的相应声明进行匹配。 如果声明了多个具有相同名称的元素,则可以通过限定其名称来控制要引用这些元素中的哪些元素。

编译器尝试将名称引用与具有最小范围的名称声明匹配。 这意味着它从进行引用的代码开始,并通过包含元素的后续级别向外层运作。

下面的示例演示对具有相同名称的两个变量的引用。 该示例在模块 container 的不同范围级别中声明两个变量,每个变量名为 totalCount。 当过程 showCount 在无限定情况下显示 totalCount 时,Visual Basic 编译器将解析对具有最小范围的声明(即 showCount 中的本地声明)的引用。 当它限定具有包含模块 totalCountcontainer 时,编译器将使用更广泛的范围解析对声明的引用。

' 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. 根据目标元素的位置确定限定路径。 从最高级别的命名空间开始,继续到最低级别的命名空间,最后以包含目标元素的模块、类或结构结束。 路径中的每个元素都必须包含它后跟的元素。

    outerSpaceinnerSpaceholdsTotalstotals

  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.LabelSystem.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  

对项目的引用

若要使用在另一个项目中定义的 Public 元素,必须首先为该项目的程序集或类型库设置引用。 若要设置引用,请单击“项目”菜单上的“添加引用”或使用 -reference (Visual Basic) 命令行编译器选项。

例如,可以使用 .NET Framework 的 XML 对象模型。 如果设置了对 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  

导入包含元素

可以使用导入语句(.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 中的隐藏

另请参阅