共用方式為


using 陳述式 (C# 參考)

更新: 2008 年 7 月

提供方便的語法,可確保正確使用 IDisposable 物件。

範例

在下列範例中,會示範如何使用 using 陳述式。

using (System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Users\Public\Documents\test.txt"))
{
    string s = null;
    while((s = sr.ReadLine()) != null)
    {
        Console.WriteLine(s);
    }
}

備註

FileFont 為 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 陳述式內宣告這些物件,如下列範例所示:

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

您可以執行個體化資源物件,然後將變數傳遞至 using 陳述式,但這不是最佳作法。在此情況下,控制項離開 using 區塊之後,即使物件無法再存取其 Umanaged 資源,仍會在範圍中。換句話說,將無法再完整初始化該物件。如果您嘗試在 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# 語言規格中的下列章節:

  • 5.3.3.17 Using 陳述式

  • 8.13 using 陳述式

請參閱

概念

C# 程式設計手冊

實作 Dispose 方法

參考

C# 關鍵字

using 指示詞 (C# 參考)

實作 Finalize 和 Dispose 以清除 Unmanaged 資源

其他資源

C# 參考

記憶體回收

變更記錄

日期

記錄

原因

2008 年 7 月

在簡介之後加入程式碼範例。

內容 Bug 修正。