[心得] IDisposable一點心得
1.C#中的using(......)
Myclass obj = new Myclass();
using(obj)
{
obj.somemethods();
}
等同下面程式碼(可以檢視IL確認)
Myclass obj = new Myclass();
try
{
obj.somethods();
}
finally
{
if(obj!=null)
{
IDisposable d;
d = obj;
d.Dispose();
}
}
所以沒有實做IDisposable的物件用using(..){...},在編譯時就會出現錯誤。
2.IDisposable 凡是需要額外釋放resource(通常是unmanaged resource -- Handle..,
或是高代價的resource如Database的connection),都應該實做這個interface,實作
了這個interface就代表Class可以透過Dispose()來明確指定釋放資源,而非依賴
Garbage Collection的機制。(關於IDisposable的實做還關係到Finalize()及thread
safe相關討論,MSDN有清楚的說明)
3.了解了IDisposable後我們已經知道自己設計的Class再什麼時候需要時做IDisposable
,使用這些實做IDisposable的Class可以用setp1.說的using(...){...}來明確指定
釋放的時機,不過使用using(...){....}有一個明顯的缺點,就是他不能同時運用到
沒有實做IDisposable的物件上面。在我們使用其他公司開發的Library會出現一些問題,
到底使用的物件要不要呼叫Dispose()來釋放掉?
這邊提供一個通用的方式(也是處理Interface的建議使用方法)
try
{
MyClasss obj = new MyClass obj;
:
:
}
finally
{
IDisposable dispose = obj as IDisposable;
if(dispose != null)
{
dispose.Dispose();
}
}
以上的用法適用所有可能實做某Interface的物件,也可以將物件間的耦合關係降低,
比如MyClass再下一版本把IDisposable拿掉了,上面的程式一樣不需要任何的修改。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.75.23.122
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章