2012-04-02 171 views
3

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

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

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

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

Use of unassigned local variable 'handler' 

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

回答

3

这是因为它确实尚未分配。尝试制作一个命名方法,以便预先知道该符号。

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

    AnEvent -= OnEvent; 
} 

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

我也建议只detatch后运行DoSmething代码,并实现一些锁定机制,如果你有multithrading,以防止从多个线程调用在完全相同的活动时间内,没有时间来detatch并因此全部运行。

6

C#编译器将首先创建您在将结果分配给变量之前写入的lambda表达式。所以当lambda被定义时,处理程序没有值。

它的工作原理是,如果您之前为EventHandler分配了一个null值。

因为它是一个封闭和局部变量在封闭的拍摄,在呼叫处理程序的时候会产生正确的值,它会工作:

 EventHandler handler=null; 

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

给所有的人downvoting:它赢得了不会导致NullReferenceException。 handler是一个在闭包中捕获的局部变量,所以当它在包含闭包的方法中发生变化时,lambda中的handler的值将会改变。我在我的电脑上测试了它,它完美地工作。

+1

如果你这样做,你会在你的回调中产生空参考异常... – 2012-04-02 12:37:57

+2

不,试试吧。处理程序在关闭中捕获。 – aKzenT 2012-04-02 12:38:46

+2

嘿,在你尝试过之前不要投票给我!阅读关于如何关闭工作...... – aKzenT 2012-04-02 12:39:29