C# using語句使用心得總結
C# using語句用于定義一個范圍,在此范圍的末尾將釋放對象,這樣的用法比較少見,常見于非托管資源。這些資源在使用后,就必須徹底釋放。
學習過C#的人都知道,using是關鍵字。在MSDN里面一查C#參考(C# Reference),using關鍵字就會有兩個主要用途:
1、作為指令,用于為命名空間創建別名或導入其他命名空間中定義的類型。請參見[using 指令]。
2、作為C# using語句,用于定義一個范圍,在此范圍的末尾將釋放對象。請參見[using 語句]。
其中,第1點就是我們所熟悉using的使用方法,而第二種C# using語句方法我們就比較少用了,它常見于非托管資源(也就是在C++編程里面可能碰到的句柄和設備上下文),這些資源使用完畢后,是必須釋放的。在C#里面,由于完全的面向對象編程,這些資源類型都實現了IDisposable接口,因此會使用在捕獲異常try...catch語句的finally塊中釋放資源,代碼如下:
- {
- Font font1 = new Font("Arial", 10.0f);
- try
- {
- byte charset = font1.GdiCharSet;
- }
- finally
- {
- if (font1 != null)
- ((IDisposable)font1).Dispose();
- }
- }
這樣確保調用Dispose,從而保證釋放資源。(請注意,使用額外的大括號為對象創建有效的范圍而此時如果使用using語句,同樣能夠獲得相同的結果,代碼如下:
- using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f))
- {
- // Use font3 and font4.
- }
using語句按照正確的方式調用對象上的Dispose方法,并(在您按照前面所示方式使用它時)會導致在調用 Dispose 時對象自身處于范圍之外。在using塊中,對象是只讀的并且無法進行修改或重新分配。
同時還要注意的一點是:
按照規則,當使用IDisposable對象時,應在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();
在這種情況下,該對象將在控制權離開 using 塊之后保持在范圍內,即使它可能將不再具有對其非托管資源的訪問權也是如此。換句話說,再也不能完全初始化該對象。如果試圖在 using 塊外部使用該對象,則可能導致引發異常,如上述代碼段3中的font2.GetHeight()調用而產生異常。由于這個原因,通常最好是在 using 語句中實例化該對象并將其范圍限制在 using 塊中。
在這一點上,如果再使用ildasm工具一查,就會看到代碼段1和代碼段2生成的代碼幾乎是完全一樣的,而這樣使用使用using語句的方式更加簡潔、方便。
本文來自liput的博客園文章《C# using指令 心得總結》
【編輯推薦】