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

如果代码引用已声明元素,则 Visual Basic 编译器将引用中的名称与该名称的相应声明进行匹配。 如果有不止一个元素是用同一名称声明的,可以通过“限定”元素的名称来控制要引用那些元素中的哪一个。

编译器使用最小范围尝试将名称引用与名称声明进行匹配。 这意味着它以进行引用的代码开始,并向外扩展到连续的包含元素级别。

下面的示例显示了对两个同名变量的引用。 该示例在 container 模块中以不同的范围级别声明了两个变量,其名称都是 totalCount。 当过程 showCount 在没有限定的情况下显示 totalCount 时,Visual Basic 编译器用最小范围(即 showCount 内的局部声明)来解析对声明的引用。 当该过程用包含模块 container 来限定 totalCount 时,编译器用更大范围来解析对声明的引用。

' 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.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)]

不能使用类名本身来限定不是 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) 命令行编译器选项。

例如,可以使用 .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

导入包含元素

可以使用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 语句导入模块、类、结构和枚举。 然后不必限定即可使用这些导入元素的成员。 但是,必须始终使用计算为类或结构的实例的变量或表达式来限定类和结构的非共享成员。

命名指南

如果定义了两个或更多个具有相同名称的编程元素,则编译器尝试解析对该名称的引用时会导致“名称多义性”。 如果范围内有多个定义或者没有定义,则引用是不可解析的。 有关示例,请参见本帮助页上的“限定引用示例”。

为所有元素提供唯一的名称可以避免名称多义性。 然后就可以对任何元素进行引用,而不必用命名空间、模块或类来限定其名称。 这样还可以减少意外引用错误元素的可能性。

Shadowing

当两个编程元素共享同一个名称时,其中一个元素可能会掩藏(或者说“隐藏”)另一个元素。 被隐藏的元素不能引用;相反,当您的代码使用被隐藏的元素名时,Visual Basic 编译器会将其解析为隐藏元素。 有关示例的更多详细说明,请参见 Visual Basic 中的隐藏

请参见

任务

如何:修改项目属性和配置设置

参考

Imports 语句(.NET 命名空间和类型)

New 运算符 (Visual Basic)

Public (Visual Basic)

概念

已声明的元素名称 (Visual Basic)

已声明元素的特性 (Visual Basic)

变量 (Visual Basic)