当代码引用声明的元素时,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
限定元素名称
如果要覆盖此搜索过程并指定在更广泛范围中声明的名称,则必须限定具有更广范围的包含元素的名称。 在某些情况下,您可能还需要对包含元素进行限定。
在源语句中限定名称是指在其之前添加标识目标元素定义位置的信息。 此信息称为 限定字符串。 它可以包含一个或多个命名空间和模块、类或结构。
限定字符串应明确指定包含目标元素的模块、类或结构。 容器可能又位于另一个包含元素(通常是命名空间)中。 你可能需要在限定字符串中包含多个包含元素。
通过限定名称来访问声明的元素
确定已定义元素的位置。 这可能包括命名空间,甚至命名空间的层次结构。 在最低级别的命名空间中,元素必须包含在模块、类或结构中。
' 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
根据目标元素的位置确定限定路径。 从最高级别命名空间开始,转到最低级别的命名空间,最后以包含目标元素的模块、类或结构结尾。 路径中的每个元素都必须包含其后面的元素。
outerSpace
innerSpace
→→holdsTotals
→totals
准备目标元素的限定字符串。 将句点 (
.
) 放置在路径中的每个元素之后。 应用程序必须有权访问限定字符串中的每个元素。outerSpace.innerSpace.holdsTotals.totals.
以正常方式编写引用目标元素的表达式或赋值语句。
grandTotal = 9000
在目标元素名称前面加上限定字符串。 名称应紧跟在包含元素的模块、类或结构后面的句点(
.
)。' Assume the following module is part of your code. Module accessGrandTotal Public Sub setGrandTotal() outerSpace.innerSpace.holdsTotals.totals.grandTotal = 9000 End Sub End Module
编译器使用限定符字符串查找一个可以匹配目标元素引用的明确声明。
如果应用程序能够访问多个具有相同名称的编程元素,则可能还需要明确名称引用。 例如, 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()
其他包含元素的成员
使用另一个类或结构的非共享成员时,必须先使用指向类或结构的实例的变量或表达式限定成员名称。 在下面的示例中,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) 命令行编译器选项。
例如,可以使用 .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
语句导入模块、类、结构和枚举。 然后,可以使用此类导入元素的成员,而无需限定。 但是,必须始终使用计算结果为类或结构实例的变量或表达式来限定类和结构的非共享成员。
命名准则
当你定义两个或多个具有相同名称的编程元素时,当编译器尝试解析对该名称的引用时, 名称不明确 可能会导致。 如果在范围内有多个定义,或者没有定义在范围内,则引用无法解析。 有关示例,请参阅此帮助页上的“限定参考示例”。
可以通过提供所有元素的唯一名称来避免名称不明确。 然后,可以引用任何元素,而无需使用命名空间、模块或类限定其名称。 还可以减少意外引用错误元素的机会。
阴影操作
当两个编程元素共享同名时,其中一个元素可以隐藏或 隐藏另一个元素。 阴影元素不可用于引用;相反,当代码使用阴影元素名称时,Visual Basic 编译器会将它解析为阴影元素。 有关示例的更详细说明,请参阅 Visual Basic 中的阴影。