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

时间:2012-04-02 12:29:50

标签: c# events event-handling

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

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

    // Detach the handler
    SizeChanged -= handler;
};
SizeChanged += handler;

但是在SizeChanged -= handler行上我收到此错误

Use of unassigned local variable 'handler'

你对我应该如何继续思考吗?我想过使用一个布尔标志,但只有当我找不到分离处理程序的方法时才会这样做。

2 个答案:

答案 0 :(得分:6)

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

如果你之前为EventHandler赋值为null,那么它可以正常工作。

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

        EventHandler handler=null;

        handler = (s, e) =>
        {
            // Do something 
            SizeChanged -= handler;
        };
        SizeChanged += handler; 

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

答案 1 :(得分:3)

这是因为它确实尚未取消分配。尝试从中创建一个命名方法,因此该符号是预先知道的。

private void OnEvent(object sender, EventArgs e)
{
    // Do something

    AnEvent -= OnEvent;
}

private void RegisterOnce()
{
    AnEvent += OnEvent;
}

我还建议仅在分离后运行DoSmething代码并实现一些锁定机制,以防多线程,以防止多个线程在同一时间调用事件,没有时间分离,因此,所有运行