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();