为什么这个声明+赋值会导致错误:
// 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);