关于delegate的一点疑问

RabbitLBJ 2012-07-27 08:59:19
我在一个delegate上面绑定一个对象的实例方法之后,那么这个对象有没有可能被释放和垃圾收集呢??
比如,有如下代码

CTest ct = new CTest() // 这是一个类,里面有个叫做CTPrint的实例方法

MyDelType d = new MyDelType(ct.CTPrint);
d();

ct = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

d();

其中我进行了一个垃圾收集,按理说在将ct=null之后ct不是应该被垃圾回收的吗??难道是因为delegate引用到他的原因??
谢谢
...全文
117 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
iyomumx 2012-07-27
  • 打赏
  • 举报
回复
绑定委托后确实会保留引用,所以.Net 4.5弄了个弱事件模式来解决这个问题。
Anod 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
不要轻易尝试调用GC.Collect()回收

绑定委托之后 内部肯定有对该对象的引用
[/Quote]

是的 就看有引用时GC.Collect()是否能释放或者立即释放了。
RabbitLBJ 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
GC.Collect()也不是立即释放,你的类可以试试实现IDisposable接口方法。
[/Quote]

谢谢你提供的意见
不过我不是很清楚我实现IDisposable有什么作用,我这个类的内部其实并没有什么东西需要释放的,我想释放掉的其实这个实例本身占据的内存。
另外我记得clr via c#里面好像有个用GC.Collect()调用绑定到Timer对象的例子,不清楚他那个和我这有什么不同呢??

谢谢各位
快溜 2012-07-27
  • 打赏
  • 举报
回复
GC.Collect()也不是立即释放,你的类可以试试实现IDisposable接口方法。
请叫我卷福 2012-07-27
  • 打赏
  • 举报
回复
不要轻易尝试调用GC.Collect()回收

绑定委托之后 内部肯定有对该对象的引用
bdmh 2012-07-27
  • 打赏
  • 举报
回复
你既然绑定了,怎么会给你释放了吗
RabbitLBJ 2012-07-27
  • 打赏
  • 举报
回复
问这个问题的原因是我想和boost的trackable进行对比,看看如果一个c#对象被释放,那么绑定到他的回调函数(委托之类)会不会自动断开连接
不过目前的情况是,绑定之后就不会释放了

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧