There is simple class with event:
public class BaseEventProvider {
public event EventHandler SomeEvent;
public void Publish() {
SomeEvent?.Invoke(this, null);
}
}
I know, that it is a difficult to unsubscribe from event, if you handle an event using lambda function and in major cases it leads to memory leaks. For example:
BaseEventProvider eventProvider = new BaseEventProvider();
eventProvider.SomeEvent += (s, e) => {
Console.WriteLine("was handled!");
};
But why in such case unsubscribing works:
class Program {
static void Main(string[] args) {
BaseEventProvider eventProvider = new BaseEventProvider();
eventProvider.SomeEvent += Handler();
eventProvider.Publish();
eventProvider.SomeEvent -= Handler();
eventProvider.Publish();
Console.ReadKey();
}
private static EventHandler Handler() {
return (s, e) => {
Console.WriteLine("was handled!");
};
}
}
Console output shows the event was only handled once:
was handled!
Is there something under the hood, probably after compilation and code optimization?