using关键字有两个主要用途:
using指令有两个用途:
using System.Text;
using Project = PC.MyCompany.Project;
using指令的特点:
下面的示例演示如何为命名空间定义和使用using别名
namespace PC { // Define an alias for the nested namespace. using Project = PC.MyCompany.Project; class A { void M() { // Use the alias Project.MyClass mc = new Project.MyClass(); } } namespace MyCompany { namespace Project { public class MyClass { } } } }using别名指令的右侧不能由开放的泛型类型。例如,不能是List<T>,但可以为List<int>创建别名。
下面演示如何为类定义using指令和using别名:
using System; // Using alias directive for a class. using AliasToMyClass = NameSpace1.MyClass; // Using alias directive for a generic class. using UsingAlias = NameSpace2.MyClass<int>; namespace NameSpace1 { public class MyClass { public override string ToString() { return "You are in NameSpace1.MyClass."; } } } namespace NameSpace2 { class MyClass<T> { public override string ToString() { return "You are in NameSpace2.MyClass."; } } } namespace NameSpace3 { // Using directive: using NameSpace1; // Using directive: using NameSpace2; class MainClass { static void Main() { AliasToMyClass instance1 = new AliasToMyClass(); Console.WriteLine(instance1); UsingAlias instance2 = new UsingAlias(); Console.WriteLine(instance2); } } } // Output: // You are in NameSpace1.MyClass. // You are in NameSpace2.MyClass.
便于正确使用IDisposable对象。
下面演示如何使用using语句。
using (Font font1 = new Font("Arial", 10.0f)) { byte charset = font1.GdiCharSet; }
File和Font是访问非托管资源的托管类型的示例。还有许多其他类型的非托管资源和对应封装这些资源的类库。所有这些类型都必须实现IDisposable接口。
当使用IDisposable对象时,应该在using语句中声明和实例化此对象。using语句能自动调用对象的Dispose方法,在调用Dispose时对象离开其作用域。在using块中,对象时只读,不能修饰也不能重新赋值。
using语句确保Dispose方法的调用,即使发生了异常。也可以将对象放在try块中并在finally块中调用Dispose来达到同样的效果,实际上,编译器就是将using语句转换为这种形式。上面的代码在编译时会扩展为下面形式:
{ Font font1 = new Font("Arial", 10.0f); try { byte charset = font1.GdiCharSet; } finally { if (font1 != null) ((IDisposable)font1).Dispose(); } }
如下所示,可以在using语句中声明一个类型的多个实例。
using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f)) { // Use font3 and font4. }
也可以实例化资源对象之后,将变量传递给using语句。不过这不是最佳做法。在这种情况下,该对象在控制权离开using语句之后还可见,但它可能不再具有对非托管资源的访问权,如果尝试在using块外部使用该对象,就可能引发异常。所以最好在using语句中实例化该对象并将其作用域限制在using块中。
Font font2 = new Font("Arial", 10.0f); using (font2) // not recommended { // use font2 } // font2 is still in scope // but the method call throws an exception float f = font2.GetHeight();