九、命名空间与 using
Covers:命名空间
命名空间
今天你准备写一个处理二维几何图形的程序,你用了 Shape 作为所有图形的基类,这很好;第二天你准备更上一层楼,写一个处理三维几何图形的程序,同时你还想让它跟昨天的成果相兼容。要怎么定义所有三维图形的基类呢?你英语不好,没想到“Geometry”这么高级的词汇,同时又不想用“Shape3d”这么 Low 的词……想来想去你决定还是用 Shape。
那么问题来了,两个基类重名了,怎么办?
命名空间 提供了解决命名冲突的方法,两个处于不同命名空间中的类即使重名也互不冲突。我们已经屡次接触 namespace
这个词了,它的意思就是定义一个命名空间。
namespace Geometry2
{
class Shape {}
}
namespace Geometry3
{
class Shape {}
}
上面在两个不同的命名空间中定义了重名的两个类,但依然能够编译通过。
命名空间也可以嵌套定义,比如把上面的两个命名空间装进一个统一的命名空间里,这样看起来更专业了:
namespace MyFabulousGeometryProject
{
namespace Geometry2
{
class Shape
{
}
}
namespace Geometry3
{
class Shape
{
}
}
}
using 关键字
想要准确地指定命名空间中的某个类,可以用点号:MyFabulousGeometryProject.Geometry2.Shape
,也可以用我们的好朋友 using
关键字:
-
using NAMESPACE;
:向当前文件中引入 NAMESPACE 命名空间中的所有类名,我们经常引入 System 命名空间,以使用其中的 Console 等类; -
using static NAMESPACE.CLASSNAME;
:向当前文件中引入 NAMESPACE 命名空间中的静态类 CLASSNAME 中的所有成员。例如在代码开头加上using static System.Console;
之后,你就再也不用每次 WriteLine 都写一遍 Console 啦:using static System.Console; namespace Happy { class Program { static void Main() { WriteLine("Long live the keyword 'using'!"); } } }
-
using ALIAS = NAME;
:为命名空间或类 NAME 起一个别名 ALIAS,此后在当前文件中你就可以使用这个别名; -
一旦你 using 了某些东西,就不能再与你引入的东西重名,比如你不能再写一个名为 Console 的类。
T.B.C.