Хорошая практика - определить пустой орган делегата для события?

Возможный дубликат:
Есть ли недостаток в добавлении анонимного пустого делегата в объявление события?

Хорошей ли практика является определение пустого тела делегата для события, так что вам не нужно беспокоиться о возникновении события, у которого нет обработчика событий? (нет необходимости проверять, является ли событие нулевым).

Как и код ниже:

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 - так что это также должна быть чистая выигрышная производительность - если частота пустых делегатов низкая.