命名空间
命名空间是类型的域,类型通常被组织到层次化的命名空间中,使它们更容易查找且避免了冲突
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 Foo
Outer.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下的类B
new global::A.B(); //使用global关键字就可以了
}
}
}
namespace A
{
class B { }
}
extern alias