命名空间
命名空间是类型的域,类型通常被组织到层次化的命名空间中,使它们更容易查找且避免了冲突
System.Text.StingBuilder
命名空间是类型名称的组成部分
System.Security.Cryptography.RSA rsa =
System.Security.Cryptography.RSA.Create();
命名空间独立于Assembly(程序集),对成员的可见性(public、private…)也没有影响
不同命名空间下可以拥有相同的名称。
namespace
namespace关键字定义了块{}里面类型的命名空间
命名空间中的点表示嵌套命名空间的层次结构
namespace Outer.Middle.Inner{class class1{}class class2{}}//相当于下面这个这种写法namespace Outer{namespace Middle{namespace Inner{class class1{}class class2{}}}}
using
using指令可导入一个命名空间,允许你不需要类型的全名就可以使用该类型
可以在不同的命名空间中定义相同名称的类型
using Outer.Middle.Inner;class Test{static void Main(){// 等于Outer.Middle.Inner.class1 c 在using引用命名空间后可以省略全名class1 c;}}
using static
从C#6开始,你不仅仅可以引入命名空间,还可以引入具体的类型,这就需要using static
被引入类型的所有静态成员可被直接使用,无需使用类名
using static System.Console;class Test{static void Main() { WriteLine("Hello"); }}
所有可访问的静态成员都被会引入,字段、属性、嵌套类型
也可用于enum,这样的话它的成员就被引入了
using static System.Windows.Visibility;class EnumTest{void Test(){var testbox = new TestBox { Visibility = Hidden };}}
命名的范围
在外层命名空间声明的名称可以在内部的命名空间里直接使用,无需全名
namespace Outer{class classOuter { }class Test{class classTest : classOuter { }}}
如果想要引用命名空间层次结构下不同分支的类型,可以使用部分名称
namespace Outer{namespace Middle.Inner{class classInner { }}class Test{class classTest : Middle.Inner.classInner { }}}
名称隐藏
如果同一个类型名同时出现在外层和内层的命名空间里。那么,直接使用类型名的时候,使用的是内层的。
namespace Outer{class Foo { }namespace Middle.Inner{class Foo { }class Test{// 同名默认使用内层中的Foo f1; //Outer.Middle.Inner FooOuter.Foo f2; //Outer.Foo}}}
重复的命名空间
可以重复声明命名空间,只要它们下面没有冲突的类型名就可以
例1.1
namespace System.Text{class ThisTestClass { }}namespace a{using System.Text;class aa{static void Test(){ThisTestClass thisTest;StringBuilder sb;}}}
嵌套using指令
可在一个命名空间内嵌套using指令
可以让using的东西的作用范围限制在这个命名空间内
例1.1
为命名空间/类型起别名
引入命名空间之后,可能会导致类型名冲突
可以不引入完整的命名空间,只引入你需要的那个类型,然后给这个类型起一个别名
using sb = System.Text.StringBuilder;namespace a{class atest{static void Main(){sb s = new sb();s.Append("Hello");}}}
命名空间的高级特性
Extern
Extern别名允许你的程序引用两个全名相同的类型名,通常这两个类型来自不同的Assembly
Namespace alias qualifiers命名空间别名限定符
内层命名空间的类型名会把外层命名空间下的类型名隐藏,有时即使使用全名也无法解决冲突
解决方法:
使用global命名空间 , ::
namespace N{class A{public class B { }static void Main(){new A.B(); // 想引用的是命名空间A下的类Bnew global::A.B(); //使用global关键字就可以了}}}namespace A{class B { }}
extern alias
