Большой вопрос: «Зачем всегда использовать EventArgs, даже если вашему событию не нужна никакая информация?». Если бы EventArgs не имел публичного конструктора, вы бы не смогли этого сделать.
Хорошим преимуществом является то, что если в будущем вы захотите передать информацию, любой существующий код все равно будет скомпилирован. Например, следующий класс начинался с использования только EventArgs, но теперь передает строку, содержащую некоторую «полезную информацию».
class SomeEventSource
{
public event EventHandler<SomeEventArgs> MyEvent;
public void FireTheEvent()
{
MyEvent(this, new SomeEventArgs("This information is interesting"));
}
}
class SomeEventArgs : EventArgs
{
public SomeEventArgs(string interestingInformation)
{
InterestingInformation = interestingInformation;
}
public string InterestingInformation { get; private set; }
}
Этот код клиента был написан до изменения, но он все еще компилируется. Если бы оригинал не использовал EventArgs, то это изменение было бы более дорогим для реализации.
class SomeClient
{
private readonly SomeEventSource _source;
public SomeClient()
{
_source = new SomeEventSource();
_source.MyEvent += source_MyEvent;
}
public void RunTest()
{
_source.FireTheEvent();
}
void source_MyEvent(object sender, EventArgs e)
{
// Do something
}
}
Существует аннотация на конструкторе EventArg, которая позволяет оптимизировать его в определенных ситуациях. Сам EventArgs отмечен как Сериализуемый и ComVisible. Любой созданный вами подкласс воспользуется ими и будет соответствовать шаблону.