聚拓互联

http://www.ejutuo.com
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

<二> 名称空间

 

   名称空间(Namespaces)称得上是Microsoft.net中最重要的概念。所谓名称空间,就是让每一个名称都有自己的活动空间,不会互相混淆。名称空间类似于文件系统中目录与文件的关系,用来控制对象标识符的范围,组织对象库和层次结构,简化对象引用,并可防止在引用对象时出现二义性。有了名称空间,就可以方便地组织应用程序要使用的各个类。.NET、Visual Basic.NET或其他语言的代码都包含在名称空间中。

 

 1. 什么是名称空间

   Microsoft在.NET平台上提供了大量的基础类,这些类构成了.net的类库。在Visual Basic.net中,可以通过继承或调用方便地访问类库,开发种种应用程序。此外,用户也可以根据需要建立自己的类和类库。因此,在Visual Basic.net中,既有系统预定义的类和类库,也有用户自己编写的类和类库。

   Visual Basic.NET预定义的类由.NET框架(..NET Framework)类库提供,而.NET框架类库由名称空间组成,每个名称空间含有可以在程序中使用的类、结构、枚举接口等。利用名称空间,可以有效地把预定义的类分为不同的类型,以便于管理和用户访问。也就是说,.NET类库提供了大量的类,通过名称空间把它们划分为不同的组。为了在自己的应用程序中使用系统提供的类、结构等资源,必须显式指定提供这些资源名称空间。

   在Visual Basic.NET中。用户可以定义自己的名称空间,并可以访问由名称空间提供的资源。

   根据作用域不同,名称空间分为两种,即局部名称和全局名称空间。在默认情况下,名称空间是局部可见的,即只对它所属的应用程序都局部的,因此,两个应用程序中的类可以同名,即使它们的名称空间同名,也不会发生冲突。这样,每个应用程序都可以有自己私有的一套名称空间和类。

   与局部名称空间不同,全局名称空间对当前机器上的所有应用程序都是可见的。因此,对于那些要用于机器上所有应用程序的类,必须放在全局名称中。一般来说,全局名称空间不如局部名称安全,对它的要求比局部名称空间要严格一些,例如必须满足严格命名和版本控件要求,必须有数位标,必须在.NET运行期间注册等。之所以这样做,是为了确保不同应用程序中的名称空间和类的命名的唯一性,但增加了不少麻烦。在可能的情况下,最好使用较安全的局部名称空间。

 

2. NET中的名称空间

2.1 .NET名称空间的整体结构

.NET提供的系统类库极为庞大,含有大量的名称空间,每个名称空间包括不同的类(Class)、结构(Structure)和接口(Interface)。大多数名称空间的顶层为System,并可根据功能在逻辑上划分为若干个子名称空间。如下图所示。

System

CodeDOM

Drawing

Runtime

Collections

Globalization

Security

ComponentModel

ServiceProcess

IO

Configuration

Text

Management

Core

Threading

Messaging

Data

Timers

Net

Diagnostics

Web

Reflection

DirectoryServices

WinForms

Resources

XML

.NET名称空间总体结构

   从图中可以看出,类库的最顶层是System,这是所有类的根名称空间,其余都是它的子名称空间。

   System名称空间及其子名称空间所提供的对象是编写应用程序的基础,可用来编写Viual C++.NET、C#.NET、Viual Basic.NET等应用程序。但是,即使是较为复杂的大型应用程序,也只能用到.NET所提供的名称空间中的小部分功能。

   在用Visula Basic.NET进行程序设计时,常用的名称空间有以下几种:

(1)System:含有大多数基本的和经常使用的类,例如Object类(被所有其他对象继承)及各种基本数据类型等。

(2)System.Refecton:由一些类和接口组成,它提供了加载类型、方法和域的控件视图,用来动态地建立和引用类型。

(3)System.IO:文件管理及其输入/输出等。

(4)System.Collection:数组、表(lists)、链表(Linked list)、图(maps)及其他数据结构。

(5)System.Web:该名称空间含有与浏览器/服务器通信的类和接口,用于ASP.NET的网页功能。它提供了以下类和对象。

   ● HTTPRequest类:有关当前HTTP请求的信息。

   ● HTTPResponse类:控件HTTM对客户的输出。

   ● HTTPServerUtility对象:访问服务器方的实用程序和方法。

   除了上述类和对象外,System.Web名称空间还提供了有关Cookie管理、文件传输、异常信息以及输出高速缓存控件的类。

(6)System.NET:提供了当前网络上多种协议的简单程序设计接口。

(7)System.Windows.Forms:提供了建立基于Windows的应用程序的类,具有可以在Microsoft Windows操作系统中使用的大量的接口功能。在该名称空间中,含有Form以及各种控件的类,用这些类可以建立用户界面。

 

 

3. 名称空间的使用

3.1 项目引用

   名称空间被集成到.NET环境中,如果不使用名称空间,则无法建立.NET应用程序。而为了在一个应用程序(项目)中使用名称空间,则必须建立该应用程序的项目引用。

   项目引用出现在解决方案资源管理器窗口中的“引用”条目中。新建一个项目后,Visual Basic.net根据所建立的项目类型自动导入部分名称空间的引用。名称空间作为组文件存放在Visual Basic.NET中,组文件指的.dll、.ocx、.exe、.tlb、.olb等,每个组件可以含有一个或多个名称空间。

3.2 直接定位

   直接定位类似于文件系统中的完整路径。只要给出名称空间的命名,就可以访问其中的任一个类。例如,为了通过控制台输入/输出流(stdio)读写,可以使用System.Console名称空间中的WriteLine方法:   System.Console.WriteLine(“This is a text”)

   该语句中的WriteLine是System.Console名称空间中的方法,它可以在“输出”窗口中输出一行文件。

   这种方法适用于应用程序中的所有名称空间。

3.3 使用Imports语句

   直接定位法可以准确地指定一个名称空间,但需要键入内容较多。为了减少键盘输入量,提高代码可读性,可以使用Imports,隐含地指定要使用的名称空间,应用程序可以使用由该关键字指定的名称空间中的类。Imports语句的格式如下:

   Imports [aliasname=] namespace

   其中aliasname(别名)是可选项,代表已知的或可能引用的名称空间。当Imports语句不含有aliasname参数时,在模块内不加限定即可访问由指定的名称空间定义的成员;而如果指定了aliasname参数,则必须通过别名空间中所包含的名字。当需要使用一个或者多个名称空间中具有相同名字的项目时,别名是很有用的。

   每个模块可以含有任意数量的Imports语句,一个模块中的Imports语句必须出现在对模块内标识符的所有引用之前。

   由Imports语句获得的成员作用域取决于在使用Imports语句时如何指定。例如如果只指定了名称空间,则该空间中所有独立命名的成员不用限定即可使用;而如果既指定了名称空间又指定名称空间成员,则只能使用成员的一部分。

   这里要注意,项目引用和Imports语句是有区别的,不要混为一谈。项目引用可以使外部对象(例如组件中的对象)用于Visual Basic.NET项目;而Imports语句用于简化对项目引用的访问,但并不提供对这些对象的访问。

   Imports语句通常放在代码模块的顶部,用来指定程序中要使用的名称空间。有了这个语句后,每次使用这个名称空间中的类时,就不必显式地给出该名称空间,从而可以减少键盘输入量。

   但是,如果两个名称空间中有同名的类,而且程序中要引入这两个名称空间,则当使用这个类时,必须显式地指定完整的空间名。否则会产生二义性。例如,假定有如下两个名称空间:

   MyMfgApp.Inventory

   MyMfgApp.Sales

这两个名称空间中均含有Product类,则下面的代码将产生错误:

   MyMfgApp.Inventory

   MyMfgApp.Sales

   Public Sub DoSomthing ()

     Dim obj As New Product ()   ‘定义Product类的一个对象

   Edn Sub

在这种情况下,编译器无法确定该引用哪个Product。如果将代码修改为:

   Dim Obj As New Sales.Product ()

则可消除由Product引起的二义性。

   在实际应用中,可能会经常遇到两个或几个名称空间有同名的类的情况,需要键入名称空间的全名,因而无法减少键盘输入量。如果给名称空间定义一个别名,则可使这种情况有所改善。

   定义了一个名称空间的别名后,可以用这个别名对名称空间的成员进行限定。例如:

   Imports ConCh=Microsoft.VisualBasic.ControlChars

为名称空间Microsoft.VisualBasic.ControlChars定义了一个别名ConCh,这样就可以用ConCh限定该名称空间的成员:

   Dim S As String

   S=”AAAAA”& ConCh.CrLf & “BBBBB’

可以看出,使用别名后,不但能避免二义性,而且可以减少键盘输入量。