C#中的using 指令和命名空间

原文地址:http://www.dingos.cn/index.php?topic=860.0

命名空间是一种将类和结构组织在一起的方式,以此限制类和结构的应用范围,避免与其他类和结构发生名称冲突。在使用 Visual C# 速成版创建程序时,将自动创建一个命名空间。若要在程序中使用其他命名空间的类,必须使用 using 指令来指定相应的命名空间。默认情况下,在创建新的应用程序时将列出最常用的 .NET Framework 命名空间。如果使用类库中其他命名空间中的类,必须在源文件中针对该命名空间添加一条 using 指令。
当代码编辑器检测到已声明了一个在当前 using 指令中所列的命名空间内无法找到的类或结构时,它将给出包含该类或结构的命名空间的建议。

【命名空间具有以下属性】

  • 组织大型代码项目。
  • 使用 . 运算符将它们分隔。
  • using directive 不必为每个类指定命名空间的名称。
  • global 命名空间是“根”命名空间:global::System 始终引用 .NET Framework 命名空间 System。

【声明命名空间】
与类的声明过程相似

  1. namespace NameSpaceName{  
  2. //此处列出该命名空间的全部类!  
  3. }  

 

 

  1. class SamsungTelevision{  
  2.     ...  
  3. }  
  4. class SamsungWalkMan{  
  5.     ...  
  6. }  
  7. class SonyTelevision{  
  8.     ...  
  9. }  
  10. class SonyWalkMan{  
  11.     ...  
  12. }  

 

 

  1. namespace Samsung{  
  2.    class Television  
  3.    {...}  
  4.   
  5.    class WalkMan  
  6.    {...}  
  7. }  
  8. namespace Sony{  
  9.    class Television  
  10.    {...}  
  11.   
  12.    class Walkman  
  13.    {...}  
  14. }  
使用命名空间解决命名冲突更简洁、更有条理、结构更清晰

 

【自定义命名空间】
在较大的编程项目中,声明自己的命名空间可以帮助控制类名称和方法名称的范围。使用 namespace 关键字可声明命名空间。
namespace 关键字用于声明一个范围。此命名空间范围允许组织代码并为提供了创建全局唯一类型的方法。
  1. namespace SampleNamespace{  
  2.     class SampleClass{}  
  3.     interface SampleInterface{}  
  4.     struct SampleStruct{}  
  5.     enum SampleEnum{a,b}  
  6.     delegate void SampleDelegate(int i);  
  7.     namespace SampleNamespace.Nested{  
  8.        class SampleClass2{}  
  9.     }  
  10. }  
在一个命名空间中,可以声明一个或多个下列类型:另一个命名空间、类 、接口、结构 、枚举 、委托  
无论是否在 C# 源文件中显式声明了命名空间,编译器都会添加一个默认的命名空间。该未命名的命名空间(有时称为全局命名空间)存在于每一个文件中。全局命名空间中的任何标识符都可用于命名的命名空间中。
命名空间隐式具有公共访问权,并且这是不可修改的。
在两个或更多的声明中定义一个命名空间是可以的。
 
【嵌套命名空间】在一个命名空间内声明另一个命名空间
  1. namespace Sony{  
  2.    namespace Television{  
  3.       class T14inches{  
  4.            ...  
  5.       }  
  6.       class T21inches{  
  7.            ...  
  8.       }  
  9.    }  
  10. }  
  1. namespace Sony.Television{  
  2.    class T14inches{  
  3.       ...  
  4.    }  
  5.    class T21inches{  
  6.       ...  
  7.    }  
  8. }  
 
【访问修饰符和命名空间】
命名空间是隐式公共的;命名空间不能为受保护的、私有的或内部的
  1. public namespace Sony{ //错误  
  2.     ...  
  3. }  
  4. private namespace Samsung{ //错误  
  5.     ...  
  6. }  
在声明命名空间时前面不应加任何访问修饰符
 
【限定名与非限定名】
限定名:要在类所属的命名空间内使用该类,只需要指定该类的名称;要在类所属的命名空间之外使用该类,必须使用该类的完全限定名来引用它。
  1. Namespace.class name  
非限定命名
  1. namespace Sony{  
  2.    class Television{  
  3.       ...  
  4.    }  
  5.    class WalkMan{  
  6.       ...  
  7.       Television MyEntertainment = new Television();  
  8.       ...  
  9.    }  
  10. }  
在类所属的命名空间内使用该类时,只需指定类名,这称为“非限定名称” 
 
【完全限定名】
命名空间和类型的名称必须唯一,由指示逻辑层次结构的完全限定名描述。
  1. namespace N1{     // N1  
  2.     class C1{      // N1.C1      
  3.         class C2{   // N1.C1.C2          
  4.         }  
  5.     }  
  6.     namespace N2{  // N1.N2      
  7.         class C2{   // N1.N2.C2          
  8.         }  
  9.     }  
  10. }  
在以上代码段中:
  • 命名空间 N1 是全局命名空间的成员。它的完全限定名是 N1。
  • 命名空间 N2 是命名空间 N1 的成员。它的完全限定名是 N1.N2。
  • 类 C1 是 N1 的成员。它的完全限定名是 N1.C1。
  • 在此代码中使用了两次 C2 类名。但是,完全限定名是唯一的。C2 的第一个实例是在 C1 中声明的;因此,其完全限定名为:N1.C1.C2。C2 的第二个实例是在命名空间 N2 中声明的;因此,其完全限定名为:N1.N2.C2。
使用以上代码段,可以用以下方法将新的类成员 C3 添加到命名空间 N1.N2 内:
  1. namespace N1.N2{  
  2.     class C3 {    
  3.         // N1.N2.C3      
  4.     }  
  5. }  
 
【限定命名 - 示例】
  1. using Sony;  
  2. using Samsung;  
  3. using System;  
  4. namespace Sony{  
  5.     namespace Television{  
  6.         class T14inches{  
  7.             public T14inches(){  
  8.                 Console.WriteLine("一台 14 英寸的电视机");  
  9.             }  
  10.         }  
  11.   
  12.         class T21inches{  
  13.             public T21inches(){  
  14.                 Console.WriteLine("一台 21 英寸的电视机");  
  15.             }    
  16.         }   
  17.     }  
  18. }  

  1. namespace Samsung{  
  2.     class Television{  
  3.         Sony.Television.T14inches myEntertainment = new Sony.Television.T14inches();  
  4.     }  
  5. }  
  6.   
  7. class Test{  
  8.     static void Main(){  
  9.         Samsung.Television myEntertainment = new Samsung.Television();  
  10.     }  
  11. }  
限定命名是在类名称前加上点操作符和名称空间
 
【using关键字】
using 关键字有两个主要用途:
  • 作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。
  • 作为语句,用于定义一个范围,在此范围的末尾将释放对象。

【using 命名空间指令】
使用限定命名会使代码变长且容易混淆

  1. Sony.Television.T14inches Television = new Sony.Television.T14inches();  
 使用 using 命名空间指令可以使长且容易混淆的名称变得简短而且有意义

 

  1. using Sony.Television;  
  2.   
  3. T14inches Television = new T14inches();  
  4. T21inches Television2 = new T21inches();  
【有效和无效的命名空间声明】
【二义性名称】
  1. using Sony;  
  2. using Samsung;  
  3. class Test{  
  4.    static void Main(){  
  5.       Television MyEntertainment = new Television();  
  6.    }  
  7. }  
这会导致错误,因为Sony,Samsung命名空间都有Television类,程序中不知调用哪个命名空间的类,类名称存在二义性。
  1. using Sony;  
  2. using Samsung;  
  3. class Test{  
  4.    static void Main(){  
  5.       Samsung.Television MyEntertainment = new Samsung.Television();  
  6.    }  
  7. }  
在类名存在二义性的情况下,只能像代码段中那样使用限定的命名空间
【using 别名指令】
using别名指令提供了一种功能,可以从命名空间中只提取一个类,并将其放入作用域中
  1. using T21inches = Sony.Televisions.T21inches;  
  2. class Test{  
  3.    static void Main(){  
  4.       T21inches M = new T21inches();  
  5.    }  
  6. }  
using 别名名称 = 到命名空间或类的完全限定路径
【using 语句】
using语句:提供能确保正确使用 IDisposable 对象的方便语法
  1. using (Font font1 = new Font("Arial", 10.0f)) {  
  2.     byte charset = font1.GdiCharSet;  
  3. }  
按照规则,当使用 IDisposable 对象时,应在 using 语句中声明和实例化此对象。using 语句按照正确的方式调用对象上的 Dispose 方法,并会导致在调用 Dispose 时对象自身处于范围之外。在 using 块中,对象是只读的并且无法进行修改或重新分配。
using 语句确保调用 Dispose,即使在调用对象上的方法时发生异常也是如此。通过将对象放入 try 块中,并在调用 finally 块中的 Dispose,可以获得相同的结果;实际上,这就是编译器转换 using 语句的方式。
可以将多个对象与 using 语句一起使用,但必须在 using 语句中声明这些对象。
  1. using (Font font3 = new Font("Arial", 10.0f),   
  2.            font4 = new Font("Arial", 10.0f)){  
  3.     // Use font3 and font4.  
  4. }  
【基类库】
是预先编写的代码的集合,这些代码可以很容易地合并到应用程序中,并在应用程序中加以使用;基类库可以被所有 .NET 支持的语言共享;根据其功能,BCL 中的类被归类到相应的命名空间中。
【最常用的命名空间和类】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜晚回家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值