我刚刚在 .NET 中实现了一个 WeakEventDelegate
类。
我曾在 http://code.logos.com/blog/2008/08/event_subscription_using_weak_references.html 中看到其他文章实现了这样的事情和 http://blogs.msdn.com/b/greg_schechter/archive/2004/05/27/143605.aspx
但是,我得到的实现没有那么复杂(尽管不太灵活),而且似乎可以完成这项工作,所以我想知道我是否遗漏了什么。
除了相对缺乏灵 active 之外,下面的实现还有什么问题吗?
public class WeakEventDelegate<TEventArgs>
where TEventArgs : EventArgs
{
private readonly WeakReference handlerReference;
public WeakEventDelegate(Action<object, TEventArgs> handler)
{
handlerReference = new WeakReference(handler);
}
public void Handle(object source, TEventArgs e)
{
Action<object, TEventArgs> unwrappedHandler = (Action<object, TEventArgs>)handlerReference.Target;
if (unwrappedHandler != null)
{
unwrappedHandler.Invoke(source, e);
}
}
}
编辑:我编写该类的唯一目的是防止从发布者到委托(delegate)的隐式引用,以防止订阅者的垃圾收集。
意思是,而不是写:
void subscribe()
{
publisher.RaiseCustomEvent += this.HandleCustomEvent;
}
我会写:
private readonly WeakDelegate<CustomEventArgs> _customHandler = new WeakDelegate<CustomEventArgs>(this.HandleCustomEvent);
void subscribe()
{
publisher.RaiseCustomEvent += _customHandler.Handle;
}
我想到的那个类的主要用例是一些集合类(订阅者),它们的生命周期我只能勉强控制。 (但是,其中一种情况发生在 WPF 数据绑定(bind)中,因此它非常适合使用推荐的弱事件基础结构)。
最佳答案
这里的主要问题是订阅您的委托(delegate) (handlerReference.Target
) 的任何内容都会使 handlerReference
保持事件状态。
将其包装起来可以让您无需持有对它的引用即可调用您的委托(delegate),但不会阻止订户保持引用处于事件状态。
Weak Event Patterns框架功能通过中介支持。订阅是通过中介来处理的,等式的两边都是通过弱引用来维护的。没有任何东西直接持有对委托(delegate)的引用 - 因为对委托(delegate)的引用使对象保持事件状态。
关于c# - WeakEventDelegate 实现 - 反馈请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6574215/