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語句前宣告物件,如:
3.可以有多個物件與 using 語句一起使用,但是必須在 using 語句內部宣告這些物件SqlCommand cmd = new SqlCommand(cmmText, GetConnection()); using (cmd ) { cmd.CommandType = cmmType; return cmd.ExecuteNonQuery(); }
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也不簡單。