Хорошая практика - определить пустой орган делегата для события?
Возможный дубликат:
Есть ли недостаток в добавлении анонимного пустого делегата в объявление события?
Хорошей ли практика является определение пустого тела делегата для события, так что вам не нужно беспокоиться о возникновении события, у которого нет обработчика событий? (нет необходимости проверять, является ли событие нулевым).
Как и код ниже:
public event EventHandler<LoadEventArgs> LoadedData = delegate { };
Ответы
Ответ 1
Я определенно нашел это полезным, да. Там будет крошечная крошечная стоимость исполнения, но преимущество в удобочитаемости для того, чтобы не выполнять тест недействительности, делает его достойным ИМО.
Стоит отметить, что это одно из немногих случаев, когда полезно использовать анонимный метод, а не лямбда-выражение - иначе вы должны указать параметры, которые вы проигнорируете, например:
public event EventHandler<LoadEventArgs> LoadedData = (sender, args) => {};
Мне не нравится называть вещи, которые я не собираюсь использовать:)
Ответ 2
Я бы этого не сделал.
Для этого есть две причины. Во-первых, стандартно просто проверить обработчик для null
перед вызовом этого. Вы видите это повсюду в примерах в исходном источнике Microsoft и в руководствах.
Во-вторых, инициализация ваших событий таким образом выделяет ненужные объекты при создании вашего класса. Это наложит дополнительное давление на ваше приложение без реальной необходимости. Это происходит потому, что:
public event EventHandler<LoadEventArgs> LoadedData = delegate { };
переводит на:
public event EventHandler<LoadEventArgs> LoadedData = new EventHandler<LoadEventArgs>delegate { });
Если вы этого не сделаете, обертывание событий в определенных методах помогает много:
public event EventHandler MyEvent;
protected virtual void OnMyEvent(EventArgs e)
{
if (MyEvent != null)
MyEvent(this, e);
}
Вы можете сделать этот поток безопасным (r), используя следующее:
public event EventHandler MyEvent;
protected virtual void OnMyEvent(EventArgs e)
{
var handler = MyEvent;
if (handler != null)
handler(this, e);
}
Ответ 3
Обычно я не использую С#, но мне кажется, что это хорошая практика. Это приложение учебника шаблона Null Object. Как уже отмечалось, это будет стоить с точки зрения производительности, когда пустой делегат действительно работает, но выигрывает с точки зрения производительности каждый раз, когда вам не нужно проверять наличие явного null - так что это также должна быть чистая выигрышная производительность - если частота пустых делегатов низкая.