using 陳述式 (C# 參考)
提供方便的語法,可確保正確使用 IDisposable 物件。
範例
在下列範例中,會示範如何使用 using 陳述式。
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
備註
File 和 Font 為 Managed 型別的範例,這些型別會存取 Unmanaged 資源 (在這個例子中,表示檔案控制代碼 (File Handle) 和裝置內容 (Device Context,DC))。 還有許多其他種類的 Unmanaged 資源,以及封裝這些資源的類別庫型別。 這些型別都必須實作 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 區塊之後,即使物件無法再存取其 Unmanaged 資源,仍會在範圍中。 換句話說,將無法再完整初始化該物件。 如果您嘗試在 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();
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格。 語言規格是 C# 語法和用法的決定性來源。
請參閱
參考
實作 Finalize 和 Dispose 以清除 Unmanaged 資源