当前位置:编程学习 > C#/ASP.NET >>

是不是只要用event,都应该用WeakEventManager来连接listener和source

只要listener不是静态对象的话 --------------------编程问答-------------------- 实在是不懂你说的是什么啊。

给出代码来演示一下你的意思。 --------------------编程问答-------------------- 如果楼主你觉得你问题的答案是“YES”的话,那么C#这个语言就直接把事件都改成弱引用算了,为什么不呢。
其实恰恰相反,事实上event正常的使用过程中多数需要的是强引用,只有特殊情况才会考虑弱引用。 --------------------编程问答--------------------
引用 1 楼 sp1234 的回复:
实在是不懂你说的是什么啊。

给出代码来演示一下你的意思。

就是Weak Event Patterns,例如直接在一个事件源上执行如下操作时

source.SomeEvent += listener.SomeEventEventHandler;

SomeEvent上就会留有listener的一个引用,这样即使用户不再引用listener,listener也不会被GC回收。除非listener主动删除SomeEvent上的连接。 --------------------编程问答--------------------
引用 2 楼 wddw1986 的回复:
如果楼主你觉得你问题的答案是“YES”的话,那么C#这个语言就直接把事件都改成弱引用算了,为什么不呢。
其实恰恰相反,事实上event正常的使用过程中多数需要的是强引用,只有特殊情况才会考虑弱引用。

为什么一定要用强引用呢? --------------------编程问答--------------------
引用 3 楼 oniisama 的回复:
就是Weak Event Patterns,例如直接在一个事件源上执行如下操作时

source.SomeEvent += listener.SomeEventEventHandler;
 SomeEvent上就会留有listener的一个引用,这样即使用户不再引用listener,listener也不会被GC回收。除非listener主动删除SomeEvent上的连接。 

用户不再引用listener的时候,它就应该调用 source.SomeEvent -= listener.SomeEventEventHandler;
--------------------编程问答--------------------
引用 5 楼 sp1234 的回复:
用户不再引用listener的时候,它就应该调用 source.SomeEvent -= listener.SomeEventEventHandler;

但有时这个可能不可控制,例如抛出异常时,又或者不知道listener什么时候不被引用。 --------------------编程问答-------------------- 如果乱注册事件,一个程序,这种东西可能有上十万、上百万。你可以现象看简单的TextBox就有多少事件,而一个程序会有多少比TextBox还复杂的控件。

因此.net实际上是千方百计少让event占用空间,从而也就加快了操作速度。例如微软自己的控件实际上不是这样直接声明event的,而是有复杂的event池的,这样就可以使得event占用空间缩小到十分之一还少的地步。

而现在,你有点像在奢侈地搞(没有什么必要的)层层形式呢。 --------------------编程问答--------------------
引用 6 楼 oniisama 的回复:
但有时这个可能不可控制,例如抛出异常时,又或者不知道listener什么时候不被引用。


如果你有所谓的事件内存泄露,这是你的设计问题。没有借口。 --------------------编程问答--------------------
引用 6 楼 oniisama 的回复:
引用 5 楼 sp1234 的回复:用户不再引用listener的时候,它就应该调用 source.SomeEvent -= listener.SomeEventEventHandler;
但有时这个可能不可控制,例如抛出异常时,又或者不知道listener什么时候不被引用。


抛出异常的时候是可以捕获并把相应的事件处理函数去掉的。但是要用event池。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,