首页 新闻 会员 周边

c#委托 注册的函数指针是否会伴随对象的销毁而销毁。。。

0
悬赏园豆:10 [已解决问题] 解决于 2014-05-26 11:13

我在想委托里存储的是实例化后的对象里的函数指针,但是当这个实例化的对象销毁后 那原来存储的函数指针是不是就自动销毁了呐?哪位大神解答一下。。。

tongling的主页 tongling | 初学一级 | 园豆:30
提问于:2014-05-22 18:11
< >
分享
最佳答案
0

1.当有一个引用指向对象或者对象的成员时,GC是不会回收这个对象的

2.引用跟指针还是有区别的,引用是安全的指针.也就是说这些引用指向的对象释放时,引用会变成空引用,而不会想指针那样还指向原来的空间

3.没有3了

收获园豆:10
吴瑞祥 | 高人七级 |园豆:29449 | 2014-05-22 18:31

在1中是不是说只要委托所在那个对象没有释放,那相应的注册委托的相应对象也不会被gc释放呐?

tongling | 园豆:30 (初学一级) | 2014-05-22 19:45

@那一年的码农: 总会有异常的时候嘛,不要在意这些细节

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-22 19:46

@吴瑞祥: a类中有个委托,b类中的构造函数里注册了a中的委托,a实例化,b实例化,b运行结束,不在引用,a实例化对象执行委托,这个时候还会执行b中的函数嘛?b中的函数使用了b的实例化对象,这不会有问题嘛?

tongling | 园豆:30 (初学一级) | 2014-05-22 20:44

@那一年的码农: 你一个委托引用对象的实例方法,那这个对象就算是有引用存在.对象就不会被回收.

就算这个对象被释放了.那委托中的方法引用也会被释放

后面一个是猜的,前面一个是不会错的

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-22 21:06

@吴瑞祥: 你的意思是只要注册了委托 就是不会被释放,那如果b的这个实例实现了IDispose接口呐,而且已经被显式的释放了,那就会抛出异常?

tongling | 园豆:30 (初学一级) | 2014-05-22 21:35

@那一年的码农: 你必须明白,实现 IDispose 的主要目的是让对象能够在被回收前能有一次机会去释放托管和非托管的资源,从而让对象在回收阶段能够更快的执行 Finalize 或者不执行——这样才能提高 GC 的效率。当你显示调用 Dispose 方法后,当此对象的引用计数不为 0 时,此对象仍然是存活的,是否会在使用对象时抛出异常,那就要看你的 Dispose 方法中是否毁坏了对象的状态以及此状态是否同调用相关。

Launcher | 园豆:45045 (高人七级) | 2014-05-23 09:09

@Launcher: 好吧 太菜,我就是感觉一个实例化后的对象注册了某一个委托之后会把自身实现方法的引用添加到这个委托里面,万一这个对象被释放掉或为null时候那不是歇菜了嘛。。。看来还要加深原理的理解,向大神看齐

tongling | 园豆:30 (初学一级) | 2014-05-23 10:30
其他回答(3)
0

C#里面没有指针啊。你要是主动dispose的话,引用(是不是你说的指针呢?)还在,只不过这个引用你不重新实例会报错

刘宏玺 | 园豆:14020 (专家六级) | 2014-05-22 19:45
0

你所说的函数指针具体到委托的实现是一个methodinfo对象(对应方法的信息)+一个实例对象的引用(静态类则为null)。

so,如果是实例对象,则这个对象是不会被销毁的,因为有引用存在。如果某种原因被强制销毁了,则委托的调用会出错的。

Timetombs | 园豆:3954 (老鸟四级) | 2014-05-23 10:15

早知道就直接问你了

支持(0) 反对(0) tongling | 园豆:30 (初学一级) | 2014-05-23 10:27
1

这个问题有点类似于前段时间找工作,去那个迈瑞生物医疗器械被问一个问题,好像是这样的,有两个类A,B,其中A类有一个事件,B类的某一个方法会去响应这个事件,那么这两个类对象的生命周期是怎么样的?(不是很急的这个题目了,貌似是这样的),目前感觉就是即便B事件已经响应完毕,假如没有任何引用指向A类的这个实例,A应该就会被回收了,然后才是B对象按照GC流程被回收。。。

LgV5 | 园豆:221 (菜鸟二级) | 2014-05-23 16:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册