Подписка на событие и уведомление
public class Stuff
{
// Public Event to allow other classes to subscribe to.
public event EventHandler GetHtmlDone = delegate { };
public void GetHTML(string url)
{
//Do stuff
// Raise Event, which triggers all method subscribed to it!
this.GetHtmlDone(this, new EventArgs());
}
}
public class Other
{
public Other()
{
Stuff stuff = new Stuff();
// Subscribe to the event.
stuff.GetHtmlDone += new EventHandler(OnGetHtmlDone);
// Execute
stuff.GetHTML("someUrl");
}
void OnGetHtmlDone(object sender, EventArgs e)
{
//Do stuff with the result since it's done
}
}
Использование этого шаблона позволяет гораздо большему числу подписчиков.
Вы также не привязываете уведомитель,класс Stuff
для вызывающего абонента, класс Other
.
У вас есть подписчики или нет, без разницы с классом Stuff
.
Класс Stuff
долженне знать о подписчике, он должен просто вызвать событие, которое он выставляет для подписки.
РЕДАКТИРОВАТЬ
Как ctacke правильно указано в комментариях, поднимаясобытие, использующее this.GetHtmlDone(this, new EventArgs());
, вызовет исключение, если никто не подписался.
Я изменил свой код выше, чтобы обеспечить безопасное создание события всегда при инициализации моего обработчика событий.
Как я всегда его использую (Я уверен, что это всегда хорошая практика - всегда инициализировать то, что вы используете.
Я мог бы добавить нулевую проверку на обработчик событий, но, по моему личному мнению, я не согласен с тем, что нужнобыть ответственнымПодвижность класса stuff
.Я чувствую, что событие всегда должно быть инициировано, поскольку это «ответственный» поступок.
Я нашел этот поток на SO, который как бы подтвердил мне, что он не кажется неправильнымсделайте так.
Кроме того, я также запускаю анализ кода для этого кода, чтобы убедиться, что я не нарушаю правило CA1805, инициализируя EventHandler.CA1805 не был поднят, и никакие правила не были нарушены.
Используя мою автомобильную аналогию из комментариев, я считаю, что не инициализировать обработчик событий и не поднимать его все время было бы то же самое, что сказать "При повороте угла в вашем".Автомобиль использует ваш индикатор, только если кто-то наблюдает, а если нет, не беспокойтесь ».Вы никогда не знаете, наблюдает ли кто-либо, поэтому вы также можете быть уверены, что всегда делаете это.
Это просто мое личное предпочтение.Кто-нибудь еще, пожалуйста, всегда добавляйте проверку! = Null, если вы предпочитаете это делать.
Большое спасибо за комментарии ctacke и за указание на это.Я многому научился из этого.
Мне придется вернуться к некоторым из моих проектов сейчас и обновить некоторый код, чтобы убедиться, что мои библиотеки не выходят из строя, если никто не подписывается на мои события.Я чувствую себя довольно глупо, никогда не замечая этого ни в одном из моих тестов.