Perché questa dichiarazione + assegnazione causano un errore:uso di variabile locale non assegnata quando si crea una funzione anonima chiusura su se stesso
// Use of unassigned local variable 'handler'.
SessionEndingEventHandler handler = (sender, e) => { isShuttingDown = true; SystemEvents.SessionEnding -= handler; };
mentre questo non:
SessionEndingEventHandler handler = null;
handler = (sender, e) => { isShuttingDown = true; SystemEvents.SessionEnding -= handler; };
In è intuitivo che il la prima affermazione dovrebbe causare un errore, ma non immediatamente chiarisce perché la seconda non lo è.
Inoltre, come è possibile sapere se l'evento SystemEvents.SessionEnding
è stato effettivamente annullato dopo la chiamata a handler(null, null)
? GetInvocationList
funziona solo con i delegati.
SystemEvents.SessionEnding += handler;
handler(null, null);
La prima istruzione è più equivalente a 'Gestore SessionEndingEventHandler;', mentre nella seconda istruzione lo si assegna a null. La sua non assegnata fino a quando il lambda è completamente costruito. Vedi http://stackoverflow.com/questions/1362204/how-to-remove-a-lambda-event-handler –