C# 命名空间
C#命名空间
命名空间是一个域,这在个域中所有的类型名字必须是唯一的,不同的类型分组归入到层次化的命名空间,
命名空间的好处是:
- 避免名字冲突。
- 便于查找类型名字。
如:System.secruity.Cryptogtaphy
下面介绍namespace 关键字的使用。
namespace test
{
class class0
{
int i;
public class0()
{
}
}
}
例如:
namespace Outer.Middle.Inner {
class Class1 {}
class Class2 {}
}
命名空间中的点表示嵌套命名空间的层次结构。
下面的代码在语义上与前面的示例相同:
namespace Outer {
namespace Middle {
namespace Inner {
class Class1 {}
class Class2 {}
}
}
}
我们可以引用一个具有完全限定名的类型。
例如,我们可以参考前面示例中的 Class1 作为 Outer.Middle.Inner.Class1。
在任何命名空间中未定义的类型都在全局命名空间中。
using指令
using
指令导入一个命名空间,允许您引用没有完全限定名称的类型。
以下导入上一个示例的 Outer.Middle.Inner 命名空间:
using Outer.Middle.Inner;
class Test {
static void Main() {
Class1 c; // Don"t need fully qualified name
}
}
名称作用域
在外部命名空间中声明的名称可以在内部命名空间内使用不合格。
在此示例中,名称 Middle 和 Class1 被隐式导入 Inner:
namespace Outer {
namespace Middle {
class Class1 {}
namespace Inner {
class Class2 : Class1 {}
}
}
}
要引用命名空间层次结构的不同分支中的类型,请使用部分限定名称。
在下面的示例中,我们基于 Common.MyBase
的 MyClass
namespace Outer {
namespace Common {
class MyBase {}
}
namespace MyNamespace {
class MyClass : Common.MyBase {}
}
}
名称隐藏
如果同一类型名称出现在内部和外部命名空间中,则内部名称将胜出。
要引用外部命名空间中的类型,必须限定其名称。
例如:
namespace Outer {
class myMethod { }
namespace Inner {
class myMethod { }
class Test {
myMethod f1; // = Outer.Inner.myMethod
Outer.myMethod f2; // = Outer.myMethod
}
}
}
重复命名空间
您可以重复命名空间声明,只要命名空间中的类型名称不冲突:
namespace Outer.Middle.Inner {
class Class1 {}
}
namespace Outer.Middle.Inner {
class Class2 {}
}
嵌套使用指令
我们可以在命名空间中嵌套一个 using 指令。
在以下示例中,Class1 在一个作用域中可见,但在另一个作用域中不可见:
namespace Outer {
class Class1 {}
}
namespace N2 {
using Outer;
class Class2 : Class1 {}
}
namespace N2 {
class Class3 : Class1 {} // Compile-time error
}
别名类型和命名空间
导入命名空间可能导致类型名冲突。
我们可以只导入你需要的特定类型,给每个类型一个别名。
例如:
using PropertyInfo2 = System.Reflection.PropertyInfo;
class Program { PropertyInfo2 p; }
整个命名空间可以进行别名,如下所示:
using R = System.Reflection;
class Program {
R.PropertyInfo p;
}
更多建议: