声明
本文内容来自微软 MVP solenovex 的视频教程——真会C#?- 第1-2章 简介和基础(完结),大致和第 14 课—— 命名空间 对应。
本文主要包括以下内容:
- 命名空间
命名空间
命名空间是类型的域,类型通常被组织到层次化的命名空间中,使它们更容易查找且避免 了冲突。命名空间是类型名称的组成部分。命名空间独立于 Assembly,对成员的可见性也没有影响。
namespace 关键字
namespace 关键字定义了块{}
里面类型的命名空间。命名空间中的点表示嵌套命名空间的层次结构。未在任何命名空间里定义的类型被称为驻留在全局命名空间中。
using 指令
using 指令可导入一个命名空间,允许你不需要类型的全名就可以使用该类型,可以在不同的命名空间中定义相同名称的类型。
using static
从 C#6 开始,不仅仅可以引入命名空间,还可以引入具体的类型,这就需要使用 using static 了。被引入类型的所有静态成员可被直接使用,无需使用类名。所有可访问的静态成员都会被引入,字段,属性,嵌套类型。也可用于 enum,这样的话它的成员就被引入了。如果多个 static 引入存在歧义的话,将会发生错误。
using static System.Console;
class Test
{
static void Main() { WriteLine ("Hello"); }
}
using static System.Windows.Visibility;
var textBox = new TextBox { Visibility = Hidden }; // XAML-style
命名空间里的规则
命名空间的作用范围
在外层命名空间声明的名称可以在内部的命名空间里直接使用,无需全名。如果想要引用命名空间层次结构下不同分支的类型,可以使用部分名称。
namespace Outer
{
class Class1 {}
namespace Inner
{
class Class2 : Class1 {}
}
}
namespace MyTradingCompany
{
namespace Common
{
class ReportBase {}
}
namespace ManagementReporting
{
class SalesReport : Common.ReportBase {}
}
}
名称隐藏
如果同一个类型名同时出现在外层和内层的命名空间里,那么,直接使用类型名的时候,使用的是内层的。
namespace Outer
{
class Foo { }
namespace Inner
{
class Foo { }
class Test
{
Foo f1; // = Outer.Inner.Foo
Outer.Foo f2; // = Outer.Foo
}
}
}
重复的命名空间
可以重复声明命名空间,只要它们下面没有冲突的类型名就可以。
namespace Outer.Middle.Inner
{
class Class1 {}
}
namespace Outer.Middle.Inner
{
class Class2 {}
}
嵌套 using 指令
可以一个命名空间内嵌套 using 指令,可以让 using 的东西的作用范围限制在这个命名空间内。
namespace N1
{
class Class1 {}
}
namespace N2
{
using N1;
class Class2 : Class1 {}
}
namespace N2
{
class Class3 : Class1 {} // Compile-time error
}
为命名空间/类型起别名
引入命名空间之后,可能会导致类型名冲突,可以不引入完整的命名空间,只引入你需要的那个类型,然后给这个类型起一个别名。
using PropertyInfo2 = System.Reflection.PropertyInfo;
class Program { PropertyInfo2 p; }
命名空间的高级特性
Extern
Extern 别名允许你的程序引用两个全名相同的类型名,通常这两个类型来自不同的 Assembly。
命名空间别名限定符 Namespace alias qualifiers
内层命名空间的类型名会把外层命名空间下的类型名隐藏,有时即使使用全名也无法解决冲突。解决方法可合用 global 命名空间,extern alias。
C-Namespaces.png
网友评论