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