Visual Basic 中的命名空间
命名空间组织在程序集中定义的对象。程序集可以包含多个命名空间,又可以包含其他命名空间。命名空间避免多义性并简化了引用,当使用大的对象组 (例如类库。
例如, .NET Framework 定义在 System.Windows.Forms 命名空间的 ListBox 类。使用完全限定名称此类,下面的代码片段演示如何声明变量:
Dim LBox As System.Windows.Forms.ListBox
避免名称冲突
.NET Framework 命名空间解决问题有时称为的命名空间 污染,类库开发人员会阻碍使用类似的名称在另一个库中。这些同现有组件的冲突有时称为 名称冲突。
例如,因此,如果您创建了 ListBox的新类,您可以使用它在您的项目中,不加限定地。但是,因此,如果在同一项目中使用 .NET Framework ListBox 类,则必须使用完全限定引用以使引用唯一。如果引用不是唯一的, Visual Basic 导致指出一个的错误,名称不明确。下面的代码示例演示如何声明这些对象:
' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox
下面的插图显示这两个命名空间层次结构,包含对象的两个命名 ListBox。
默认情况下,使用 Visual Basic 创建的所有可执行文件都包含与同名的命名空间与项目名称相同。例如,因此,如果您定义了名为 ListBoxProject的项目中的对象,则可执行文件 ListBoxProject.exe 将包含命名空间调用的 ListBoxProject。
多个程序集可以使用同一命名空间。Visual Basic 将它们视为单个设置名称。例如,您可以定义命名空间调用的 SomeNameSpace 的类在名为 Assemb1的程序集,并定义同一命名空间的其他类从名为 Assemb2的程序集。
完全限定名称
命名空间的名称为前缀对象定义的完全限定名是对象引用。您就可以使用在其他项目中定义的对象,如果创建了对类 (选择 添加引用 从 项目 菜单) 为对象并使用完全限定名在您的代码。下面的代码片段演示如何使用另一项目的命名空间中的对象的完全限定名:
Dim LBC As New ListBoxProject.Form1.ListBox
完全限定名可防止命名冲突,因为它们使编译器可以确定使用哪个对象。但是,名称本身可能变得冗长繁琐。若要避免这一点,可以使用 Imports 语句定义可以在完全限定名位置的 别名缩写名称。例如,下面的代码示例创建两个完全限定名的别名,然后使用这些别名定义两个对象。
Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox
如果使用 Imports 语句,而无需别名,可以使用该命名空间中的所有名称,而不用限定,,只要它们对项目是唯一的。如果项目包含同名的项的命名空间的 Imports 语句,必须完全限定,则使用该名称时。假定,例如,项目包含如下两个 Imports 语句:
' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2
如果尝试使用 Class1 ,而不必完全限定它, Visual Basic 导致指出一个的错误,该名称 Class1 不明确。
命名空间级语句
在命名空间内,您可以定义项 (如模块、接口、类、委托、枚举、结构和其他命名空间。您不能定义项 (如属性、过程、变量和事件在命名空间级别。必须在容器中声明这些项 (如模块、结构或类。
在完全限定名称的全局关键字
如果您定义命名空间的嵌套层次结构,该层次结构中的代码访问 .NET framework 的 System 空间块。下面的示例演示 SpecialSpace.System 命名空间块。 System的访问中的层次结构。
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As System.Int32
Dim n As System.Int32
Return n
End Function
End Class
End Namespace
End Namespace
因此, SpecialSpace.System ,因为未定义 Int32, Visual Basic 编译器不能成功解析对 System.Int32。可以使用 Global 关键字开始限定链在 .NET framework 类库最外层的。这允许您在类库中指定 System 命名空间或其他命名空间。下面的示例阐释了这一点。
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As Global.System.Int32
Dim n As Global.System.Int32
Return n
End Function
End Class
End Namespace
End Namespace
可以使用 Global 访问其他根级别的命名空间,如 Microsoft.VisualBasic和所有命名空间与项目。
在 Namespace 语句的全局关键字
在 ". 还可以使用 Global 关键字。 Namespace 语句这使您可以定义命名空间在项目外部根命名空间。
在项目的所有命名空间根据项目的根命名空间。Visual Studio 针对项目中所有代码将项目名称,默认根命名空间。例如,因此,如果您的项目命名 ConsoleApplication1,其编程元素属于命名 ConsoleApplication1。如果声明 Namespace Magnetosphere,对该项目的 Magnetosphere 将访问 ConsoleApplication1.Magnetosphere。
下面的示例使用 Global 关键字声明命名空间在项目的根命名空间之外。
Namespace Global.Magnetosphere
End Namespace
Namespace Global
Namespace Magnetosphere
End Namespace
End Namespace
在命名空间声明, Global 另一个命名空间不能嵌套。
您可以使用 “项目设计器” ->“应用程序”页 (Visual Basic) 查看和修改项目的 根命名空间 。对新项目, 根命名空间 默认为项目名称。若要使 Global 是顶级命名空间,可以清除 根命名空间 项,以便框为空。签 根命名空间 移除对 Global 关键字的需要在命名空间声明。
如果 Namespace 语句声明也是 .NET framework 的命名空间的名称, .NET framework 命名空间变得不可用,如果 Global 未使用关键字完全限定名。若要启用对的访问 .NET framework 命名空间,而无需使用 Global 关键字,则在 Namespace 语句中包括 Global 关键字。
下面的示例有 Global 关键字在 System.Text 命名空间声明。
如果 Global 关键字不存在命名空间声明, StringBuilder 无法访问未指定 Global.System.Text.StringBuilder。对于命名 ConsoleApplication1的项目,如果没有使用,则,对 System.Text 会访问 ConsoleApplication1.System.TextGlobal 关键字。
Module Module1
Sub Main()
Dim encoding As New System.Text.TitanEncoding
' If the namespace defined below is System.Text
' instead of Global.System.Text, then this statement
' causes a compile-time error.
Dim sb As New System.Text.StringBuilder
End Sub
End Module
Namespace Global.System.Text
Class TitanEncoding
End Class
End Namespace
请参见
任务
如何:使用命令行创建和使用程序集(C# 和 Visual Basic)