Can Events be declared as Static, if yes how and why
You can create static events. You use them the same way as a normal event, except that it's used in a static context within the class.
public class MyClass
{
public static event EventHandler MyEvent;
private static void RaiseEvent()
{
MyEvent?.Invoke(typeof(MyClass), EventArgs.Empty);
}
}
That being said, there are many issues with static events. You must take extra care to unsubscribe your objects from static events, since a subscription to a static event will root your subscribing instance, and prevent the garbage collector from ever collecting it.
Also, I've found that most cases where I'd want to make static events, I tend to learn towards using a standard event on a Singleton instead. This handles the same scenarios as a static event, but is (IMO) more obvious that you're subscribing to a "global" level instance.
Yes, you can. See, for example, Application.ApplicationExit. Note, however, the warnings on that page about memory leaks when attaching to static events; that applies to all static events.
There's nothing magical about when you use them: when you need to provide an event for a static class or an event that deals exclusively with static data and it makes sense to implement it this way.