作者tomex (Tomex Ou)
看板C_Sharp
標題Re: [問題] 請問C#的delete...
時間Wed Oct 1 22:46:07 2008
※ 引述《ilovebbs (!!)》之銘言:
: ※ 引述《tomex (Tomex Ou)》之銘言:
: : c#不需要刪物件,只要該物件沒被參考到
: : 就會被GC自動回收。
: : Garbage Collector的回收機制
: : http://blog.taiwanpage.com.tw/rssview.cfm?id=34746
: : 但~ 如果你是愛乾淨的人,很難接受這樣
: : 因此你可以呼叫物件的 Dispose()函數來明確回收
: : 另也可以善用 using(object o) {...}
: : 它也能自動引發Dispose()函數。
: 我想問一下,呼叫Dispose是馬上會回收嗎?
: 我發現好像不是馬上回收的樣子,有方法可以讓它馬上回收掉嗎?
Dispose()使用是我們用來釋放掉一個物件最大效能負荷的記憶體使用
如關檔或其他耗資源的記憶體陣列等等
其實這樣就夠了,其餘的就讓gc來自動搜集就好了
有程式潔癖的人可能仍然覺得不夠,但留一條生路走
其實可以增加很多效能,例如Weak Reference觀念:
http://wiki.dabutek.com/WeakReference.ashx
當然,你也可以再強制呼叫Finialize()或GC.Collect()等清除動作
但我試過好像也不會立即生效,畢竟.NET有自己GC收集演算法
很多書會跟你說,太過人工干預回收時機,整體效能並不好。
我其實也是有程式潔癖的人,但後來抑制住自己的控制慾,
就像機車類型,你騎速克達享受便利,卻要求它起步像排檔車迅速
又圖方便,又要切檔省油,豈不是太挑剔了??
有時候我們還是選擇相信設計者的巧思吧!!
畢竟人家在設計自動記憶體管理時,
一定都考慮到比我們更不知深幾層的地方
選擇相信他們吧...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.166.114.125
※ 編輯: tomex 來自: 118.166.114.125 (10/01 22:49)
→ tomex:如果還要堅持,那就用unsafe{自己去delete}方式!! 10/01 22:53
→ tomex:如果處理影像或需要很即時清除的話,我會用unsafe c++方式清 10/01 22:54
推 cole945:Dispose()是在收unmanaged的資源,但GC是收managed資源.. 10/01 23:35
→ cole945:跟耗不耗大不大沒什麼關係@.@" 10/01 23:37
→ tomex:IDispose中就看你怎麼回收,其實也可以不用分那麼清楚... 10/02 00:20
→ tomex:WinForm的實作IDispose因為有分unmanged/managed回收故要分 10/02 00:21
→ tomex:但若自己的函式實際上就看怎麼清資源,不需細分而作繭自x 10/02 00:23
推 cole945:我的意思是,你有沒有呼叫Dispose(),其實不影響物件什麼時 10/02 00:35
→ cole945:後被回收.__." 10/02 00:36
→ cole945:ex: Lala l1 = new Lala(); Lala l2 = l1; l1.dispose(); 10/02 00:37
→ cole945:因為l2和l1都仍指著那個"new Lala()" 所以GC不會去回收它 10/02 00:37
→ tomex:是的,Strong Reference存在時,都不會被GC mark的 10/06 14:30