1

このブログ投稿で 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 実装のバグを説明できますか?

4

2 に答える 2

2

「C# による CLR」の著者である Jeffrey Richter は、C#による CLRWeakEventHandlerWeakDelegate実装について実際に取り上げました。

ここで繰り返す意味はありませんが、彼の修正されたコードはこちらで確認できます: https://www.wintellect.com/weak-event-handlers/

本に示されているコードは、彼が意図したとおりには機能しないため、上記のリンクは彼の修正を示しています。

于 2012-10-14T06:08:10.073 に答える