Насколько я понимаю, есть два основных преимущества:
- Люди, пишущие код, использующий событие, распознают шаблон и сразу узнают, как использовать событие
- Подписьсобытия составлены таким образом, что оно устойчиво к изменениям
Первый пункт должен быть довольно очевидным, не требуя особой проработки.
Что касается второго пункта,Есть две причины для этого (по моему мнению).Во-первых, поскольку отправитель object
, подпись события может быть повторно использована несколькими типами.Во-вторых, поскольку второй параметр является потомком EventArgs
, когда вы вводите свой собственный класс EventArgs
, этот класс может быть расширен позже без изменения сигнатуры события.
Обновление
Ответ на вопрос:
Я не уверен, что вы имеете в виду, имея в виду «возможность расширять EventArgs без изменения подписи события»?!
Давайтевозьмем пример, возьмем следующий класс:
public class SomeClass
{
public event EventHandler<FileEventArgs> SomethingHappened;
}
public class FileEventArgs : EventArgs
{
public FileEventArgs(string filename)
{
Filename = filename;
}
public string Filename { get; private set; }
}
Затем у нас есть получатель, который прослушивает событие SomethingHappened
:
static void SomethingHappenedHandler(object sender, FileEventArgs e)
{
// do something intelligent
}
Теперь, допустим, мы хотим расширитьинформация, которую мы передаем в событии, с информацией о том, что произошло с файлом:
public enum WhatHappened
{
Copy,
Rename,
Delete
}
public class FileEventArgs : EventArgs
{
public FileEventArgs(string filename, WhatHappened whatHappened)
{
Filename = filename;
WhatHappened = whatHappened;
}
public string Filename { get; private set; }
public WhatHappened WhatHappened { get; private set; }
}
Теперь, если бы мы решили отправить имя файла в качестве параметра в самом событии, нам нужно было бы изменитьподпись события путем добавления другого параметра, эффективно нарушающего весь код, который прослушивает событие.Но поскольку в приведенном выше коде мы просто добавили еще одно свойство к классу FileEventArgs
, подпись остается неизменной, и нет необходимости обновлять прослушиватели (если они не хотят использовать добавленное свойство, т. Е.).
Я пишу в предположении, что если событие вызывается внутри статического метода, то параметр «источник объекта» бесполезен?!
Да, это правильно.Обычно я передаю null
в качестве аргумента отправителя из static
событий (что, честно говоря, очень редко).