Visual Basic 中的命名空间

命名空间用于组织程序集内定义的对象。 程序集可以包含多个命名空间,后者又可以包含其他命名空间。 命名空间在使用大量对象(如类库)时,会防止歧义和简化引用。

例如,.NET Framework 定义 ListBox 命名空间中的 System.Windows.Forms 类。 以下代码片段演示如何使用这个类的完全限定名声明变量:

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 不明确。

命名空间级别语句

在命名空间中,可以定义模块、接口、类、委托、枚举、结构和其他命名空间等项。 不能在命名空间级别定义属性、过程、变量和事件等项。 必须在容器中声明这些项,例如模块、结构或类。

完全限定名中的全局关键字

如果定义了命名空间的嵌套层次结构,则可能会阻止该层次结构中的代码访问 System .NET Framework 的命名空间。 以下示例展示了一个层次结构,其中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  

因此,Visual Basic 编译器无法成功解析对 System.Int32的引用,因为 SpecialSpace.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,以及与项目关联的任何命名空间。

命名空间语句中的全局关键字

你还可以在 Global 中使用 关键字。 这样,便可以从项目的根命名空间中定义命名空间。

项目中的所有命名空间都基于项目的根命名空间。 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 中的命名空间,而在完全限定名称中未使用Global关键字,则 .NET Framework 命名空间将不可用。 若要在不使用该 Global 关键字的情况下启用对该 .NET Framework 命名空间的访问,可以在 Global 语句中包含 Namespace 关键字。

以下示例在Global命名空间声明中具有System.Text关键字。

如果命名空间声明中没有Global关键字,则无法在未指定StringBuilder的情况下访问Global.System.Text.StringBuilder。 对于名为 ConsoleApplication1 的项目,如果未使用 System.Text 关键字,则引用对 ConsoleApplication1.System.Text 的访问将引导至 Global

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

另请参阅