[心得] IDisposable一點心得

看板C_Sharp (C#)作者 (Op穎)時間20年前 (2005/06/03 15:35), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
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
文章代碼(AID): #12e0XS2t (C_Sharp)
文章代碼(AID): #12e0XS2t (C_Sharp)