C# 命名空间使用细节
前言
命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。
在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。
我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,
但不同文件夹中的文件可以重名。
一、定义命名空间
命名空间的定义是以关键字 namespace 开始,后跟命名空间的名称,如下所示:
namespace namespace_name { // 代码声明 }
为了调用支持命名空间版本的函数或变量,会把命名空间的名称置于前面,如下所示:
namespace_name.item_name;
下面的程序演示了命名空间的用法:
using System; namespace first_space { class namespace_cl { public void func() { Console.WriteLine("Inside first_space"); } } } namespace second_space { class namespace_cl { public void func() { Console.WriteLine("Inside second_space"); } } } class TestClass { static void Main(string[] args) { first_space.namespace_cl fc = new first_space.namespace_cl(); second_space.namespace_cl sc = new second_space.namespace_cl(); fc.func(); sc.func(); Console.ReadKey(); } }
当上面的代码被编译和执行时,它会产生下列结果:
Inside first_space Inside second_space
二、using 关键字
using 关键字表明程序使用的是给定命名空间中的名称。例如,我们在程序中使用 System 命名空间,其中定义了类 Console。我们可以只写:
Console.WriteLine ("Hello there");
我们可以写完全限定名称,如下:
System.Console.WriteLine("Hello there");
您也可以使用 using 命名空间指令,这样在使用的时候就不用在前面加上命名空间名称。该指令告诉编译器随后的代码使用了指定命名空间中的名称。下面的代码演示了命名空间的应用。
让我们使用 using 指令重写上面的实例:
using System; //添加的using指令 using first_space; using second_space; namespace first_space { class abc { public void func() { Console.WriteLine("Inside first_space"); } } } namespace second_space { class efg { public void func() { Console.WriteLine("Inside second_space"); } } } class TestClass { static void Main(string[] args) { abc fc = new abc(); efg sc = new efg(); fc.func(); sc.func(); Console.ReadKey(); } }
当上面的代码被编译和执行时,它会产生下列结果:
Inside first_space Inside second_space
三、嵌套命名空间
命名空间可以被嵌套,即您可以在一个命名空间内定义另一个命名空间,如下所示:
namespace namespace_name1 { // 代码声明 namespace namespace_name2 { // 代码声明 } }
您可以使用点(.)运算符访问嵌套的命名空间的成员,如下所示:
using System; using SomeNameSpace;//使用1 using SomeNameSpace.Nested;//使用2 namespace SomeNameSpace { public class MyClass { static void Main() { Console.WriteLine("In SomeNameSpace"); Nested.NestedNameSpaceClass.SayHello();//使用1:using SomeNameSpace NestedNameSpaceClass.SayHello();//使用2:using SomeNameSpace.Nested Console.ReadLine(); } } // 内嵌命名空间 namespace Nested { public class NestedNameSpaceClass { public static void SayHello() { Console.WriteLine("In Nested"); } } } }
四、using static 指令
指定无需指定类型名称即可访问其静态成员的类型
注意:
该指令只支持静态方法和属性,不支持实例成员。
using static指令需要添加到文件顶部,即放在namespace之前
using System; using static System.Math;// 直接使用System.Math.PI namespace SomeNameSpace { public class MyClass { static void Main() { double a = 2 * PI;//直接使用PI Console.WriteLine(a); Console.ReadLine(); } } }
五、using起别名
using Project = PC.MyCompany.Project;
六、using语句【将实例与代码绑定】
using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f)) { // Use font3 and font4. }
代码段结束时,自动调用font3和font4的Dispose方法,释放实例。
总结
using指令:引入命名空间
using static 指令:无需指定类型名称即可访问其静态成员
using起别名
using语句:将实例与代码绑定,结束后自动Dispose,释放实例资源。【在与数据库交互时常用到】
补充
补充1【异常:不明确的引用】
如果两个不同空间的类被简写后同名,则这个类会陷入不确定的引用状态。
请看如下例子:
using System; using firstNameSpace; using SecondNameSpace; namespace SomeNameSpace { public class MyClass { static void Main() { //Function func1 = new Function();//报错:不明确的引用 firstNameSpace.Function func2 = new firstNameSpace.Function();//加上限定的命名空间后,就不会报错了 func2.Method(); Console.ReadLine(); } } } namespace firstNameSpace { public class Function { public void Method() { Console.WriteLine("firstNameSpace Method"); } } } namespace SecondNameSpace { public class Function { public void Method() { Console.WriteLine("SecondNameSpace Method"); } } }
上述代码提示如下错误:
需要修改如下:
总结:如果命名空间有多个相同的类 进行实例化调用时候,需要明确指定命名空间+ 点 的方式调用同名class