1. 程式人生 > >C#關鍵字using的幾種用法

C#關鍵字using的幾種用法

     一、作為語句,強制物件清理

        用於定義一個範圍,在此範圍的末尾將釋放物件

        C# 通過 .NET Framework 公共語言執行庫 (CLR) 自動釋放用於儲存不再需要的物件的記憶體。記憶體的釋放具有不確定性;一旦 CLR 決定執行垃圾回收,就會釋放記憶體。但是,通常最好儘快釋放諸如檔案控制代碼和網路連線這樣的有限資源。

        using 語句允許程式設計師指定使用資源的物件應當何時釋放資源。為 using 語句提供的物件必須實現 IDisposable 介面。此介面提供了 Dispose 方法,該方法將釋放此物件的資源。

         可以在到達 using 語句的末尾時,或者在該語句結束之前引發了異常並且控制權離開語句塊時,退出 using 語句。

         1. 可以在 using 語句中宣告物件,例如:

using (cmd = new SqlCommand(cmmText, GetConnection()))
            {
                cmd.CommandType = cmmType;
                return cmd.ExecuteNonQuery();
            }
        2.在using語句前宣告物件,如:
SqlCommand cmd = new SqlCommand(cmmText, GetConnection());
            using (cmd )
            {
                cmd.CommandType = cmmType;
                return cmd.ExecuteNonQuery();
            }
        3.可以有多個物件與 using 語句一起使用,但是必須在 using 語句內部宣告這些物件
using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f))

{

// Use font3 and font4.

}

由來:

        要理解清楚使用using語句強制清理資源,就首先從瞭解Dispose模式說起,而要了解Dispose模式,則應首先了解.NET的垃圾回收機制。這些顯然不是本文所能完成的巨集論,我們只需要首先明確的是.NET提供了Dispose模式來實現顯式釋放和關閉物件的能力。

Dispose模式

         Dispose模式是.NET提供的一種顯式清理物件資源的約定方式,用於在.NET 中釋放物件封裝的非託管資源。因為非託管資源不受GC控制,物件必須呼叫自己的Dispose()方法來釋放,這就是所謂的Dispose模式。從概念角度來看,Dispose模式就是一種強制資源清理所要遵守的約定;從實現角度來看,Dispose模式就是讓要一個型別實現IDisposable介面,從而使得該型別提供一個公有的Dispose方法。

        本文不再討論如何讓一個型別實現Dispose模式來提供顯示清理非託管資源的方式,而將注意集中在如何以using語句來簡便的應用這種實現了Dispose模式的型別的資源清理方式。我們在記憶體管理與垃圾回收章節將有詳細的討論。

        using語句提供了強制清理物件資源的便捷操作方式,允許指定何時釋放物件的資源,其典型應用為:

     using (Font f = new Font("Verdana", 12, FontStyle.Regular))

      { 

        //執行文字繪製操作

       Graphics g = e.Graphics;

        Rectangle rect = new Rectangle(10, 10, 200, 200);

        g.DrawString("Try finally dispose font.", f, Brushes.Black, rect);

     }//執行結束,釋放f物件資源

       在上述典型應用中,using語句在結束時會自動呼叫欲被清除物件的Dispose()方法。因此,該Font物件必須實現IDispose介面,才能使用using語句強制物件清理資源。我們檢視其型別定義可知:

         public sealed class Font : MarshalByRefObject, ICloneable, ISerializable, IDisposable

      Font型別的確實現了IDisposeable介面,也就具有了顯示回收資源的能力。

     同理上例中的SqlCommand實現了也實現了IDisposable介面,可以使用using語句實現資源釋放。

實質

   在程式編譯階段,編譯器會自動將using語句生成為try-finally語句,並在finally塊中呼叫物件的Dispose方法,來清理

資源。所以,using語句等效於try-finally語句,例如:


    Font f2 = new Font("Arial", 10, FontStyle.Bold);
  try
  {
      //執行文字繪製操作
  }
  finally
  {
      if (f2 != null) ((IDisposable)f2).Dispose();
  }

二、作為指令

    ①.允許在名稱空間中使用型別,這樣,您就不必在該名稱空間中限定某個型別的使用:

       using System.Text;

    ②.為名稱空間或型別建立別名。

     using Project = PC.MyCompany.Project;

     using 指令的範圍限制為包含它的檔案。

   C#關鍵字的多重身份,為提高程式的效能提供幫助。小小的using也不簡單。