在创建关闭自身的匿名函数时使用未赋值的局部变量



为什么这个声明+赋值会导致错误:

// Use of unassigned local variable 'handler'.
SessionEndingEventHandler handler = (sender, e) => { isShuttingDown = true; SystemEvents.SessionEnding -= handler; };

SessionEndingEventHandler handler = null;
handler = (sender, e) => { isShuttingDown = true; SystemEvents.SessionEnding -= handler; };

直观地认为第一个语句应该会导致错误,但不立即清楚为什么第二个语句不会。

此外,我如何判断SystemEvents.SessionEnding事件在调用handler(null, null)后是否实际上已取消订阅?GetInvocationList只适用于委托。

SystemEvents.SessionEnding += handler;
handler(null, null);

这和你期望它失败的原因是一样的:

int i = 1 - i;

语句的右边在赋值前求值,在求值时,变量还没有赋值。

如果你认为lambdas/delegate改变了一些东西,考虑下面的语句:

int i = ((Action)() => 1 - i)();

因为您是在分配i之前创建lambda的,所以 i可以在为其分配任何值之前使用。从编译器的角度来看,您不希望这种情况发生的事实并不会改变事情——您必须在使用变量之前显式地为其赋值。如果它是一个空值,那么至少编译器知道当你到达它时,你正在考虑它将为空的可能性。

关于你的最后一个问题,SessionEndingEventHandler 委托。这样就可以了:

var unsubscribed = SystemEvents.SessionEnding == null ||
    !SystemEvents.SessionEnding.GetInvocationList().Contains(handler);

相关内容

  • 没有找到相关文章

最新更新