我想只调用一次事件处理程序,然后将其分离。我试着写:
EventHandler handler = (s, e) =>
{
// Do something
//
// blabla
// Detach the handler
SizeChanged -= handler;
};
SizeChanged += handler;
但是在SizeChanged -= handler
行上我收到此错误
Use of unassigned local variable 'handler'
你对我应该如何继续思考吗?我想过使用一个布尔标志,但只有当我找不到分离处理程序的方法时才会这样做。
答案 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代码并实现一些锁定机制,以防多线程,以防止多个线程在同一时间调用事件,没有时间分离,因此,所有运行