作者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)
1F:→ tomex:如果还要坚持,那就用unsafe{自己去delete}方式!! 10/01 22:53
2F:→ tomex:如果处理影像或需要很即时清除的话,我会用unsafe c++方式清 10/01 22:54
3F:推 cole945:Dispose()是在收unmanaged的资源,但GC是收managed资源.. 10/01 23:35
4F:→ cole945:跟耗不耗大不大没什麽关系@.@" 10/01 23:37
5F:→ tomex:IDispose中就看你怎麽回收,其实也可以不用分那麽清楚... 10/02 00:20
6F:→ tomex:WinForm的实作IDispose因为有分unmanged/managed回收故要分 10/02 00:21
7F:→ tomex:但若自己的函式实际上就看怎麽清资源,不需细分而作茧自x 10/02 00:23
8F:推 cole945:我的意思是,你有没有呼叫Dispose(),其实不影响物件什麽时 10/02 00:35
9F:→ cole945:後被回收.__." 10/02 00:36
10F:→ cole945:ex: Lala l1 = new Lala(); Lala l2 = l1; l1.dispose(); 10/02 00:37
11F:→ cole945:因为l2和l1都仍指着那个"new Lala()" 所以GC不会去回收它 10/02 00:37
12F:→ tomex:是的,Strong Reference存在时,都不会被GC mark的 10/06 14:30