命名空间

命名空间是类型的域,类型通常被组织到层次化的命名空间中,使它们更容易查找且避免了冲突
System.Text.StingBuilder
命名空间是类型名称的组成部分
System.Security.Cryptography.RSA rsa =
System.Security.Cryptography.RSA.Create();
命名空间独立于Assembly(程序集),对成员的可见性(public、private…)也没有影响
不同命名空间下可以拥有相同的名称。

namespace

namespace关键字定义了块{}里面类型的命名空间
命名空间中的点表示嵌套命名空间的层次结构

  1. namespace Outer.Middle.Inner
  2. {
  3. class class1{}
  4. class class2{}
  5. }
  6. //相当于下面这个这种写法
  7. namespace Outer
  8. {
  9. namespace Middle
  10. {
  11. namespace Inner
  12. {
  13. class class1{}
  14. class class2{}
  15. }
  16. }
  17. }

未在任何命名空间里定义的类型被称为驻留在全局名称空间中

using

using指令可导入一个命名空间,允许你不需要类型的全名就可以使用该类型
可以在不同的命名空间中定义相同名称的类型

  1. using Outer.Middle.Inner;
  2. class Test
  3. {
  4. static void Main()
  5. {
  6. // 等于Outer.Middle.Inner.class1 c 在using引用命名空间后可以省略全名
  7. class1 c;
  8. }
  9. }


using static

从C#6开始,你不仅仅可以引入命名空间,还可以引入具体的类型,这就需要using static
被引入类型的所有静态成员可被直接使用,无需使用类名

  1. using static System.Console;
  2. class Test
  3. {
  4. static void Main() { WriteLine("Hello"); }
  5. }


所有可访问的静态成员都被会引入,字段、属性、嵌套类型
也可用于enum,这样的话它的成员就被引入了

  1. using static System.Windows.Visibility;
  2. class EnumTest
  3. {
  4. void Test()
  5. {
  6. var testbox = new TestBox { Visibility = Hidden };
  7. }
  8. }

如果多个static引入存在歧义的话,将会发生错误

命名的范围

在外层命名空间声明的名称可以在内部的命名空间里直接使用,无需全名

  1. namespace Outer
  2. {
  3. class classOuter { }
  4. class Test
  5. {
  6. class classTest : classOuter { }
  7. }
  8. }


如果想要引用命名空间层次结构下不同分支的类型,可以使用部分名称

  1. namespace Outer
  2. {
  3. namespace Middle.Inner
  4. {
  5. class classInner { }
  6. }
  7. class Test
  8. {
  9. class classTest : Middle.Inner.classInner { }
  10. }
  11. }


名称隐藏

如果同一个类型名同时出现在外层和内层的命名空间里。那么,直接使用类型名的时候,使用的是内层的。

  1. namespace Outer
  2. {
  3. class Foo { }
  4. namespace Middle.Inner
  5. {
  6. class Foo { }
  7. class Test
  8. {
  9. // 同名默认使用内层中的
  10. Foo f1; //Outer.Middle.Inner Foo
  11. Outer.Foo f2; //Outer.Foo
  12. }
  13. }
  14. }

重复的命名空间

可以重复声明命名空间,只要它们下面没有冲突的类型名就可以

例1.1

  1. namespace System.Text
  2. {
  3. class ThisTestClass { }
  4. }
  5. namespace a
  6. {
  7. using System.Text;
  8. class aa
  9. {
  10. static void Test()
  11. {
  12. ThisTestClass thisTest;
  13. StringBuilder sb;
  14. }
  15. }
  16. }


嵌套using指令

可在一个命名空间内嵌套using指令
可以让using的东西的作用范围限制在这个命名空间内
例1.1

为命名空间/类型起别名

引入命名空间之后,可能会导致类型名冲突
可以不引入完整的命名空间,只引入你需要的那个类型,然后给这个类型起一个别名

  1. using sb = System.Text.StringBuilder;
  2. namespace a
  3. {
  4. class atest
  5. {
  6. static void Main()
  7. {
  8. sb s = new sb();
  9. s.Append("Hello");
  10. }
  11. }
  12. }


命名空间的高级特性

Extern
Extern别名允许你的程序引用两个全名相同的类型名,通常这两个类型来自不同的Assembly
未命名图片.png
未命名图片.png

Namespace alias qualifiers命名空间别名限定符

内层命名空间的类型名会把外层命名空间下的类型名隐藏,有时即使使用全名也无法解决冲突
解决方法:
使用global命名空间 , ::

  1. namespace N
  2. {
  3. class A
  4. {
  5. public class B { }
  6. static void Main()
  7. {
  8. new A.B(); // 想引用的是命名空间A下的类B
  9. new global::A.B(); //使用global关键字就可以了
  10. }
  11. }
  12. }
  13. namespace A
  14. {
  15. class B { }
  16. }

extern alias
未命名图片.png