Do i have to unsubscribe from anonymous event handlers of local variables?

后端 未结 3 2255
暖寄归人
暖寄归人 2021-02-20 04:34

If I have a code that looks something like this:

public void Foo()
{
    Bar bar = new Bar();

    bar.SomeEvent += (sender, e) =>
    {
        //Do somethin         


        
3条回答
  •  星月不相逢
    2021-02-20 05:20

    The above answers are correct; I just wanted to make a note. Anonymous delegates used as handlers can only be unsubscribed if you retain some other reference to the delegate/lambda. This is because lambdas are "function literals", kind of like string literals, however unlike strings they are NOT compared semantically when determining equality:

    public event EventHandler MyEvent;
    
    ...
    
    //adds a reference to this named method in the context of the current instance
    MyEvent += Foo;
    
    //Adds a reference to this anonymous function literal to MyEvent
    MyEvent += (s,e) => Bar();
    
    ...
    
    //The named method of the current instance will be the same reference
    //as the named method.
    MyEvent -= Foo;
    
    //HOWEVER, even though this lambda is semantically equal to the anonymous handler, 
    //it is a different function literal and therefore a different reference,
    //which will not match the anonymous handler.
    MyEvent -= (s,e) => Bar();
    
    var hasNoHandlers = MyEvent == null; //false
    
    //To successfully unsubscribe a lambda, you have to keep a reference handy:
    
    EventHandler myHandler = (s,e) => Bar();
    
    MyEvent += myHandler;
    
    ...
    
    //the variable holds the same reference we added to the event earlier,
    //so THIS call will remove the handler.
    MyEvent -= myHandler;
    

提交回复
热议问题