As we all know, we can create an EventHandler and add methods to it N number of times. Like:
// Declare and EventHandler
public event EventHandler
To find the number of event handlers, you can use this code:
InternetConnectionAvailableEvent.GetInvocationList().Length;
The following code demonstrates that MyEvent -= null
does not clear the list of handlers.
public static event EventHandler MyEvent;
[STAThread]
static void Main()
{
MyEvent += (s,dea) => 1.ToString();
MyEvent -= null;
Console.WriteLine(MyEvent.GetInvocationList().Length);
// Prints 1
MyEvent = null;
Console.WriteLine(MyEvent == null);
// Prints true
}
To clear the list (which is probably never a good idea), you can set the event to null (as long as you are in the class that declared the event).
Delegates are removed by equality, so you're not removing anything from the invocation list because nothing in the invocation list would be null
.
What you are describing is a field-like event. It is the same as the longhand event declaration, except no body.
From inside the class, you can set the event to null. From outside the class you cannot do this. Events follow a subscribe and unsubscribe methodology. Within the class you reference the variable, outside the class you reference the event.
See this answer by Jon Skeet on events.