2012-10-14 43 views
1

如果发现WeakEventHandler在this blog post这个WeakEventHandler的错误是什么?

但他说:

更新:是的,我知道这是坏了。还有,这意味着它不工作的错误...

,不说是什么:(错误

public class WeakEventHandler<DT, T> where T : EventArgs 
{ 
    private WeakReference weakRefToOriginalDelegate; 
    public WeakEventHandler(EventHandler<T> originalDelegate) 
    { 
     weakRefToOriginalDelegate = new WeakReference(originalDelegate); 
    } 

    private void DoInvoke(object sender, T args) 
    { 
     EventHandler<T> originalDelegate = (EventHandler<T>) weakRefToOriginalDelegate.Target; 
     if (originalDelegate != null) originalDelegate(sender, args); 
    } 

    public static implicit operator DT(WeakEventHandler<DT, T> wd) 
    { 
     object o = Delegate.CreateDelegate(typeof (DT), wd, "DoInvoke"); 
     return (DT) o; 
    } 
} 

有人能解释什么是在这个WeakEventHandler执行错误?

回答

2

杰弗里里希特,“通过C#CLR”实际上是通过C#覆盖CLR WeakEventHandlerWeakDelegate实现

是毫无意义的重复在这里为你,但你可以在这里查看他的修改后的代码的作者:http://www.wintellect.com/cs/blogs/jeffreyr/archive/2011/03/17/weak-event-handlers.aspx

书中显示的代码并不像他的意图那样工作,所以上面的链接指向他的更正。

+0

我不是在寻找弱事件的实现,而是想了解上面显示的实现有什么问题。我刚刚通过C#检查了CLR,它具有与上面所示相同的弱事件处理程序实现。 Richter在他的博客中说,它不能按预期工作,所以我想知道这个实现有什么问题。 –

+1

我看到的区别是第一个版本使用WeakReference引用委托本身,但“更正版本”使用WeakReference引用委托的目标。这是什么意思? WeakReference在引用委托时无法正确工作? –