知道什么是VB.NET命名空间吗?对于命名组织在程序集中定义的对象你有深入的了解吗?程序集可以包含多个VB.NET命名空间命名空间,而命名空间可以包含其他命名空间。命名空间避免了使用大的对象组(如类库)时的多义性并简化了引用。下面我们来看一个例子.
例如,.NET Framework 在 System.Windows.Forms 命名空间中定义 ListBox 类。以下代码片段说明如何使用该类的完全限定名声明变量:
- Visual Basic
- Dim LBox As System.Windows.Forms.ListBox
一.避免名称冲突
.NET Framework 命名空间解决了有时被称为“命名空间污染”的问题,即在另一个库中使用类似名称妨碍了类库的开发者。这些同现有组件的冲突有时被称为“名称冲突”。
例如,如果创建一个名为 ListBox 的新类,则在项目内部不需任何限定即可使用它。但是,如果想要在同一项目中使用 .NET Framework ListBox 类,就必须使用完全限定的引用以使引用***。如果该引用不***,Visual Basic 会产生错误,指明该名称不明确。下面的代码示例说明如何声明这些对象:
- 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 将它们视为单一的一组名称。例如,可以在名为 Assemb1 的程序集中为名为 SomeNameSpace 的命名空间定义类,在名为 Assemb2 的程序集中为同一命名空间定义附加的类。
二.完全限定名
完全限定名是以在其中定义对象的命名空间的名称为前缀的对象引用。如果创建对该类的引用(选择“项目”菜单中的“添加引用”),然后在代码中使用对象的完全限定名,就可以使用在其他项目中定义的对象。下面的代码片段说明如何使用另一项目命名空间中的对象的完全限定名:
- Visual Basic
- Dim LBC As New ListBoxProject.Form1.ListBox
命名冲突,因为它们使编译器能够确定哪个对象正在被使用。然而,名称本身可能变得冗长繁琐。为避免这点,可以使用 Imports 语句来定义“别名”,别名是一个可用来替代完全限定名的缩写名称。例如,下面的代码示例为两个完全限定名创建别名,并且使用这些别名定义两个对象。
- Visual Basic
- Imports LBControl = System.Windows.Forms.ListBox
- Imports MyListBox = ListBoxProject.Form1.ListBox
- Visual Basic
- Dim LBC As LBControl
- Dim MyLB As MyListBox
如果使用 Imports 语句而不用别名,可以不加限定地使用该命名空间中的所有名称,只要它们对项目而言是***的即可。如果项目包含的命名空间的 Imports 语句含有同名项,则使用该名称时必须完全限定它。例如,假设项目包含如下两个 Imports 语句:
- Visual Basic
- ' This namespace contains a class called Class1.
- Imports MyProj1
- ' This namespace also contains a class called Class1.
- Imports MyProj2
如果试图在没有完全限定的情况下使用 Class1,Visual Basic 将产生错误,指出名称 Class1 不明确。
VB.NET命名空间级语句
在命名空间内,可以定义像模块、接口、类、委托、枚举、结构以及其他命名空间这样的项。无法在命名空间级别定义诸如属性、过程、变量和事件等项目。必须在诸如模块、结构或类等容器内声明这些项目。
注意
如果您定义的命名空间是嵌套层次结构,则该层次结构中的代码访问其他同名命名空间中的类时,可能会被阻塞。例如,如果您在一个名为 SpecialSpace 的命名空间中定义了一个叫做 System 的命名空间,则 .NET Framework System 命名空间的成员将无法访问,除非您用关键字 Global 对这些成员进行完全限定。有关更多信息,请参见 Global。
【编辑推荐】