C# pattern to prevent an event handler hooked twice

This question already has an answer here:

  • How to ensure an event is only subscribed to once 6 answers

  • Explicitly implement the event and check the invocation list. You'll also need to check for null:

    using System.Linq; // Required for the .Contains call below:
    
    ...
    
    private EventHandler foo;
    public event EventHandler Foo
    {
        add
        {
            if (foo == null || !foo.GetInvocationList().Contains(value))
            {
                foo += value;
            }
        }
        remove
        {
            foo -= value;
        }
    }
    

    Using the code above, if a caller subscribes to the event multiple times, it will simply be ignored.


    如果只是首先用-=删除事件,如果没有发现异常则不会抛出

    /// -= Removes the event if it has been already added, this prevents multiple firing of the event
    ((System.Windows.Forms.WebBrowser)sender).Document.Click -= new System.Windows.Forms.HtmlElementEventHandler(testii);
    ((System.Windows.Forms.WebBrowser)sender).Document.Click += new System.Windows.Forms.HtmlElementEventHandler(testii);
    

    I've tested each solution and the best one (considering performance) is:

    private EventHandler _foo;
    public event EventHandler Foo {
    
        add {
            _foo -= value;
            _foo += value;
        }
        remove {
            _foo -= value;
        }
    }
    

    No Linq using required. No need to check for null before cancelling a subscription (see MS EventHandler for details). No need to remember to do the unsubscription everywhere.

    链接地址: http://www.djcxy.com/p/51488.html

    上一篇: + =新的EventHandler(方法)vs + =方法

    下一篇: C#模式来防止事件处理程序挂钩两次