原文地址:http://www.dingos.cn/index.php?topic=860.0
命名空间是一种将类和结构组织在一起的方式,以此限制类和结构的应用范围,避免与其他类和结构发生名称冲突。在使用 Visual C# 速成版创建程序时,将自动创建一个命名空间。若要在程序中使用其他命名空间的类,必须使用 using 指令来指定相应的命名空间。默认情况下,在创建新的应用程序时将列出最常用的 .NET Framework 命名空间。如果使用类库中其他命名空间中的类,必须在源文件中针对该命名空间添加一条 using 指令。
当代码编辑器检测到已声明了一个在当前 using 指令中所列的命名空间内无法找到的类或结构时,它将给出包含该类或结构的命名空间的建议。
【命名空间具有以下属性】
- 组织大型代码项目。
- 使用 . 运算符将它们分隔。
- using directive 不必为每个类指定命名空间的名称。
- global 命名空间是“根”命名空间:global::System 始终引用 .NET Framework 命名空间 System。
【声明命名空间】
与类的声明过程相似
- namespace NameSpaceName{
- //此处列出该命名空间的全部类!
- }
- class SamsungTelevision{
- ...
- }
- class SamsungWalkMan{
- ...
- }
- class SonyTelevision{
- ...
- }
- class SonyWalkMan{
- ...
- }
- namespace Samsung{
- class Television
- {...}
- class WalkMan
- {...}
- }
- namespace Sony{
- class Television
- {...}
- class Walkman
- {...}
- }
【自定义命名空间】
在较大的编程项目中,声明自己的命名空间可以帮助控制类名称和方法名称的范围。使用 namespace 关键字可声明命名空间。
namespace 关键字用于声明一个范围。此命名空间范围允许组织代码并为提供了创建全局唯一类型的方法。
在较大的编程项目中,声明自己的命名空间可以帮助控制类名称和方法名称的范围。使用 namespace 关键字可声明命名空间。
namespace 关键字用于声明一个范围。此命名空间范围允许组织代码并为提供了创建全局唯一类型的方法。
- namespace SampleNamespace{
- class SampleClass{}
- interface SampleInterface{}
- struct SampleStruct{}
- enum SampleEnum{a,b}
- delegate void SampleDelegate(int i);
- namespace SampleNamespace.Nested{
- class SampleClass2{}
- }
- }
在一个命名空间中,可以声明一个或多个下列类型:另一个命名空间、类 、接口、结构 、枚举 、委托
无论是否在 C# 源文件中显式声明了命名空间,编译器都会添加一个默认的命名空间。该未命名的命名空间(有时称为全局命名空间)存在于每一个文件中。全局命名空间中的任何标识符都可用于命名的命名空间中。
命名空间隐式具有公共访问权,并且这是不可修改的。
在两个或更多的声明中定义一个命名空间是可以的。
无论是否在 C# 源文件中显式声明了命名空间,编译器都会添加一个默认的命名空间。该未命名的命名空间(有时称为全局命名空间)存在于每一个文件中。全局命名空间中的任何标识符都可用于命名的命名空间中。
命名空间隐式具有公共访问权,并且这是不可修改的。
在两个或更多的声明中定义一个命名空间是可以的。
【嵌套命名空间】在一个命名空间内声明另一个命名空间
- namespace Sony{
- namespace Television{
- class T14inches{
- ...
- }
- class T21inches{
- ...
- }
- }
- }
- namespace Sony.Television{
- class T14inches{
- ...
- }
- class T21inches{
- ...
- }
- }
【访问修饰符和命名空间】
命名空间是隐式公共的;命名空间不能为受保护的、私有的或内部的
命名空间是隐式公共的;命名空间不能为受保护的、私有的或内部的
- public namespace Sony{ //错误
- ...
- }
- private namespace Samsung{ //错误
- ...
- }
在声明命名空间时前面不应加任何访问修饰符
【限定名与非限定名】
限定名:要在类所属的命名空间内使用该类,只需要指定该类的名称;要在类所属的命名空间之外使用该类,必须使用该类的完全限定名来引用它。
非限定命名
限定名:要在类所属的命名空间内使用该类,只需要指定该类的名称;要在类所属的命名空间之外使用该类,必须使用该类的完全限定名来引用它。
- Namespace.class name
- namespace Sony{
- class Television{
- ...
- }
- class WalkMan{
- ...
- Television MyEntertainment = new Television();
- ...
- }
- }
在类所属的命名空间内使用该类时,只需指定类名,这称为“非限定名称”
【完全限定名】
命名空间和类型的名称必须唯一,由指示逻辑层次结构的完全限定名描述。
在以上代码段中:
使用 using 命名空间指令可以使长且容易混淆的名称变得简短而且有意义
命名空间和类型的名称必须唯一,由指示逻辑层次结构的完全限定名描述。
- namespace N1{ // N1
- class C1{ // N1.C1
- class C2{ // N1.C1.C2
- }
- }
- namespace N2{ // N1.N2
- class C2{ // N1.N2.C2
- }
- }
- }
- 命名空间 N1 是全局命名空间的成员。它的完全限定名是 N1。
- 命名空间 N2 是命名空间 N1 的成员。它的完全限定名是 N1.N2。
- 类 C1 是 N1 的成员。它的完全限定名是 N1.C1。
- 在此代码中使用了两次 C2 类名。但是,完全限定名是唯一的。C2 的第一个实例是在 C1 中声明的;因此,其完全限定名为:N1.C1.C2。C2 的第二个实例是在命名空间 N2 中声明的;因此,其完全限定名为:N1.N2.C2。
- namespace N1.N2{
- class C3 {
- // N1.N2.C3
- }
- }
【限定命名 - 示例】
- using Sony;
- using Samsung;
- using System;
- namespace Sony{
- namespace Television{
- class T14inches{
- public T14inches(){
- Console.WriteLine("一台 14 英寸的电视机");
- }
- }
- class T21inches{
- public T21inches(){
- Console.WriteLine("一台 21 英寸的电视机");
- }
- }
- }
- }
- namespace Samsung{
- class Television{
- Sony.Television.T14inches myEntertainment = new Sony.Television.T14inches();
- }
- }
- class Test{
- static void Main(){
- Samsung.Television myEntertainment = new Samsung.Television();
- }
- }
限定命名是在类名称前加上点操作符和名称空间
【using关键字】
using 关键字有两个主要用途:
using 关键字有两个主要用途:
- 作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。
- 作为语句,用于定义一个范围,在此范围的末尾将释放对象。
【using 命名空间指令】
使用限定命名会使代码变长且容易混淆
- Sony.Television.T14inches Television = new Sony.Television.T14inches();
- using Sony.Television;
- T14inches Television = new T14inches();
- T21inches Television2 = new T21inches();
【有效和无效的命名空间声明】
【二义性名称】
这会导致错误,因为Sony,Samsung命名空间都有Television类,程序中不知调用哪个命名空间的类,类名称存在二义性。
- using Sony;
- using Samsung;
- class Test{
- static void Main(){
- Television MyEntertainment = new Television();
- }
- }
- using Sony;
- using Samsung;
- class Test{
- static void Main(){
- Samsung.Television MyEntertainment = new Samsung.Television();
- }
- }
在类名存在二义性的情况下,只能像代码段中那样使用限定的命名空间
【using 别名指令】
using别名指令提供了一种功能,可以从命名空间中只提取一个类,并将其放入作用域中
using别名指令提供了一种功能,可以从命名空间中只提取一个类,并将其放入作用域中
- using T21inches = Sony.Televisions.T21inches;
- class Test{
- static void Main(){
- T21inches M = new T21inches();
- }
- }
using 别名名称 = 到命名空间或类的完全限定路径
【using 语句】
using语句:提供能确保正确使用 IDisposable 对象的方便语法
using语句:提供能确保正确使用 IDisposable 对象的方便语法
- using (Font font1 = new Font("Arial", 10.0f)) {
- byte charset = font1.GdiCharSet;
- }
按照规则,当使用 IDisposable 对象时,应在 using 语句中声明和实例化此对象。using 语句按照正确的方式调用对象上的 Dispose 方法,并会导致在调用 Dispose 时对象自身处于范围之外。在 using 块中,对象是只读的并且无法进行修改或重新分配。
using 语句确保调用 Dispose,即使在调用对象上的方法时发生异常也是如此。通过将对象放入 try 块中,并在调用 finally 块中的 Dispose,可以获得相同的结果;实际上,这就是编译器转换 using 语句的方式。
可以将多个对象与 using 语句一起使用,但必须在 using 语句中声明这些对象。
可以将多个对象与 using 语句一起使用,但必须在 using 语句中声明这些对象。
- using (Font font3 = new Font("Arial", 10.0f),
- font4 = new Font("Arial", 10.0f)){
- // Use font3 and font4.
- }
【基类库】
是预先编写的代码的集合,这些代码可以很容易地合并到应用程序中,并在应用程序中加以使用;基类库可以被所有 .NET 支持的语言共享;根据其功能,BCL 中的类被归类到相应的命名空间中。
是预先编写的代码的集合,这些代码可以很容易地合并到应用程序中,并在应用程序中加以使用;基类库可以被所有 .NET 支持的语言共享;根据其功能,BCL 中的类被归类到相应的命名空间中。
【最常用的命名空间和类】