using 語句api
提供可確保正確使用 IDisposable 對象的方便語法。spa
示例code
下面的示例演示如何使用 using 語句。對象
using (var font1 = new Font("Arial", 10.0f)) { byte charset = font1.GdiCharSet; }
備註blog
File 和 Font 是訪問非託管資源(本例中爲文件句柄和設備上下文)的託管類型的示例。 有許多其餘類別的非託管資源和封裝這些資源的類庫類型。 全部此類類型都必須實現 IDisposable 接口。接口
IDisposable 對象的生存期限於單個方法時,應在 using 語句中聲明並實例化它。 using 語句按照正確的方式調用對象上的 Dispose 方法,並(在按照前面所示方式使用它時)會致使在調用 Dispose 時對象自身處於範圍以外。 在 using 塊中,對象是隻讀的而且沒法進行修改或從新分配。ci
using 語句可確保調用 Dispose,即便 using 塊中發生異常也是如此。 經過將對象放入 try 塊中,而後調用 finally 塊中的 Dispose,能夠實現相同的結果;實際上,這就是編譯器轉換 using 語句的方式。 前面的代碼示例在編譯時將擴展到如下代碼(請注意,使用額外的大括號爲對象建立有限範圍):資源
{ var font1 = new Font("Arial", 10.0f); try { byte charset = font1.GdiCharSet; } finally { if (font1 != null) ((IDisposable)font1).Dispose(); } }
有關 try-finally 語句的詳細信息,請參閱 try-finally 主題。作用域
可在 using 語句中聲明一個類型的多個實例,以下面的示例中所示:get
using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f)) { // Use font3 and font4. }
能夠實例化資源對象,而後將變量傳遞到 using 語句,但這不是最佳作法。 在這種狀況下,程序退出 using 塊之後,對象保留在做用域中,可是可能沒有訪問其未託管資源的權限。 換而言之,它再也不是徹底初始化的。 若是嘗試在 using 塊外部使用該對象,則可能致使引起異常。 所以,一般最好在 using 語句中實例化該對象並將其範圍限制在 using 塊中。
var 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();
有關釋放 IDisposable 對象的詳細信息,請參閱使用實現 IDisposable 的對象。
C# 語言規範
有關詳細信息,請參閱 C# 語言規範中的 using 語句。 該語言規範是 C# 語法和用法的權威資料。