第一次调用它时分离处理程序

Bap*_*net 3 c# events event-handling

我想只调用一次事件处理程序,然后将其分离.我试着写:

EventHandler handler = (s, e) =>
{
    // Do something
    //
    // blabla

    // Detach the handler
    SizeChanged -= handler;
};
SizeChanged += handler;
Run Code Online (Sandbox Code Playgroud)

但是在线上SizeChanged -= handler我得到了这个错误

Use of unassigned local variable 'handler'
Run Code Online (Sandbox Code Playgroud)

你有关于我应该如何进行的想法吗?我想过使用布尔标志,但只有当我找不到分离处理程序的方法时才会这样做.

aKz*_*enT 6

在将结果赋给变量之前,C#编译器将首先创建您编写的lambda表达式.因此,当定义lambda时,handler没有值.

但是,如果您之前为EventHandler分配了null值,则它可以正常工作.

因为它是一个闭包,并且在闭包中捕获局部变量,所以在调用处理程序时将具有正确的值并且它将起作用:

        EventHandler handler=null;

        handler = (s, e) =>
        {
            // Do something 
            SizeChanged -= handler;
        };
        SizeChanged += handler; 
Run Code Online (Sandbox Code Playgroud)

对所有人进行downvoting:它不会导致NullReferenceException.handler是一个在闭包中捕获的局部变量,因此当lambda中包含闭包的方法发生变化时,lambda中的handler值将会改变.我在我的电脑上实际测试过它,效果很好.

  • 不,试试吧.处理程序在闭包中被捕获. (2认同)
  • 嘿,在你尝试之前不要投票给我!了解闭包的工作原理...... (2认同)