欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » C#从入门到精通 » 正文

1.3 使用命名空间

创建时间:2013年08月13日 22:36  阅读次数:(5971)
分享到:
前面的例子只是一个非常小的程序。然而,小程序可能很快变成大程序。随着程序规模的增大,两个问题随之而来。首先,代码越多,就越难理解和维护。其次,更多的代码通常意味着更多的名称、更多的方法以及更多的类。随着名称越来越多,极有可能因为两个或多个名称发生冲突,造成项目无法生成(假如程序还使用了第三方的库,而且那些库的开发者同样使用了很多名称,这个问题会变得更严重)。

过去,程序员通过为名称添加某种形式的限定符前缀来解决名称冲突问题。但这并不是一个好的方案,因为它不具备扩展性。名称变长后,我们打字的时间就增多了,而且还要花更多的时间来反复阅读令人费解的长名字。所以,真正花在写软件上的时间就减少了。

命名空间(namespace)就是为了解决这个问题而设计的,它能为其他标识符(如类名)创建一个具名的容器。同名的两个类如果在不同的命名空间中,相互之间是不会混淆的。可以在一个名为TextHello的命名空间中创建一个名为Greeting的类,如下所示:
namespace TextHello
{
class Greeting
{
……
}
}

然后,就可以在自己的程序中将Greeting 类引用为TextHello.Greeting。如果有人在一个不同的命名空间(例如NewNamespace)中也创建了一个名为Greeting的类,并把它安装到你的机器上,那么你的程序仍能正常工作,因为程序使用的是TextHello.Greeting类。如果想引用另一个开发者的Greeting类,必须把它指定为NewNamespace.Greeting。

作为一个好习惯,应该在命名空间中定义自己的所有类,Visual Studio 2010环境默认使用项目名称作为顶级命名空间。.NET Framework类库(FCL)也遵循这个约定;.NET Framework中的每个类都存在于一个命名空间中。例如,Console类存在于System命名空间中。这意味着它的全名实际是System.Console。

当然,如果每次都必须写一个类的全名,似乎还不如添加限定符前缀,或者使用systemConsole之类的全局唯一名称来命名一个类。幸运的是,可以在程序中使用一个using指令来解决该问题。回到Visual Studio 2010中的TextHello程序,并观察“代码和文本编辑器”窗口中的Program.cs文件,会注意到文件顶部的以下语句:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using语句限定了要使用的命名空间。在同一个文件中,在(这些using语句)后面的代码中,不再需要用所属的命名空间来显式限定每一个对象。由于上述4个命名空间包含的类被人们频繁地使用,所以每次新建一个项目时,Visual Studio 2010都会自动添加这些using语句。可以在一个源文件的顶部添加更多的using指令。

以下练习进一步演示了命名空间的概念。
1. 在“代码和文本编辑器”窗口中,将Program.cs文件顶部第一个using指令变成注释:
//using System;

2. 在“生成”菜单中,选择“生成解决方案”。 生成失败,“错误列表“窗口中将显示以下错误信息:
当前上下文中不存在名称"Console"。

3. 在“错误列表”窗口中,双击错误消息。 导致错误的标识符会在Program.cs源文件中被自动选定。

4. 在“代码和文本编辑器”窗口中,编辑Main方法以使用完全限定的名称,即System.Console。Main方法现在应该像下面这样:
static void Main(string[] args)
{
System.Console.WriteLine("Hello World");
}

注意:输入System时,"智能感知"列表将显示System命名空间中的所有项的名称

5. 在“生成”菜单中选择“生成解决方案”。 这一次,程序应该成功生成。否则,请核实Main的代码是否与上述代码完全一致,然后试着重新生成。

6. 在“调试”菜单中选择“开始执行(不调试)”命令以运行应用程序,确定它仍能正常工作。

命名空间和程序集
using语句指出:以后要使用的名称来源于一个命名空间,在代码中不必对类名进行完全限定4。类被编译到程序集(assembly)中。程序集是一种文件,通常使用.dll扩展名。不过,严格地说,带有.exe扩展名的可执行文件也是程序集。

一个程序集可以包含许多类。构成.NET Framework类库的那些类(例如System.Console等等)是在和Visual Studio一起安装的程序集中提供的。正如后文所述,.NET Framework类库是由数千个类组成的。假如它们都放在同一个程序集中,这个程序集必将变得非常庞大,造成很难进行管理。(想象一下,假如Microsoft更新了一个类中的一个方法,就必须将整个类库发放给所有开发人员。)

因此,.NET Framework类库被分解成多个程序集,具体按照其中包含的类的功能来进行划分。例如,一个"核心"程序集包含了所有常用的类,System.Console类是其中之一;另外还有其他大量程序集,它们包含的类分别用于操纵数据库、访问Web服务以及构建GUI等等。要使用某个程序集中的一个类,必须在自己的项目中添加对该程序集的一个引用。然后,还要在代码中添加using语句,指定要使用一个命名空间在该程序集中的项(比如类)。

注意,程序集和命名空间不一定是一对一的关系;在一个程序集中,可能包含属于多个命名空间的类,而一个命名空间也可能跨越多个程序集。这一点最初会让人觉得非常困惑,但习惯之后就好了。

我们知道,使用Visual Studio新建应用程序时,需要先选好一个模板(例如”控制台应用程序”)。在选择的模板中,会自动包含对恰当的程序集的引用。例如,在TextHello项目的"解决方案资源管理器"中,如果展开"引用"文件夹,会发现在一个控制台应用程序中,自动包含了对Microsoft.CSharp,System,System.Core,System.Data,System.Data.DataExtensions,System.Xml和System.Xml.Linq等程序集的引用。可以非常方便地为项目添加对其他程序集的引用,具体做法是右击"引用"文件夹,然后从弹出的快捷菜单中选择"添加引用"命令。稍后的练习将执行这个任务。
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 54+81=? 的结果(结果是:135)
结  果: