Действительно ли вызов является дополнительным методом на “пустой” ссылке (т.е. событие без подписчиков) зло?

59
задан quetzalcoatl 16 July 2014 в 19:59
поделиться

7 ответов

Не злой. Мне жаль, что события не проложили себе путь по умолчанию. Кто-то может объяснить, почему событие без подписчиков является пустым?

35
ответ дан Dan Goldstein 24 November 2019 в 18:32
поделиться

Можно всегда объявлять события как это (не, что я рекомендую его):

public event EventHandler<EventArgs> OnClicked = delegate { };

Тот способ, которым им присвоили что-то им, когда Вы называете их, таким образом, они не бросают исключение нулевого указателя.

можно, вероятно, избавиться от ключевого слова делегата в C# 3.0...

14
ответ дан jonnii 24 November 2019 в 18:32
поделиться

Происхождение из среды Java это всегда казалось нечетным мне. Я думаю, что никакое слушание события не совершенно допустимо. Особенно, когда слушатели добавлены и удалены динамично.

мне это кажется одним из глюков C#, который вызывает ошибки, когда люди не знают / забывают проверять на пустой указатель каждый раз.

Сокрытие этой детали реализации кажется хорошим планом, поскольку это не помогает удобочитаемости проверить на пустые указатели каждый раз. Я уверен, что MSFTs скажет, что существует увеличение производительности в не constucting событие, если никто не слушает, но по моему скромному мнению это значительно перевешивается бессмысленными исключениями нулевого указателя / сокращение удобочитаемости в большей части бизнес-кода.

я также добавил бы эти два метода к классу:

    public static void Raise(this EventHandler handler, object sender)
    {
        Raise(handler, sender, EventArgs.Empty);
    }

    public static void Raise<TA>(this EventHandler<TA> handler, object sender, TA args)
        where TA : EventArgs
    {
        if (handler != null)
        {
            handler(sender, args);
        }
    }
6
ответ дан Squirrel 24 November 2019 в 18:32
поделиться

Не забывайте использовать [MethodImpl(MethodImplOptions.NoInlining)], еще его возможное, что это не ориентировано на многопотоковое исполнение.

(Чтение, которое где-нибудь давно, помнило его, погугленный и нашло http://blog.quantumbitdesigns.com/tag/events/ )

9
ответ дан alvin 24 November 2019 в 18:32
поделиться

Почему это было бы злым?

Его цель ясна: Это генерирует событие MyButtonClicked.

Это действительно добавляет вызов функции наверху, но в.NET это будет или оптимизировано далеко или довольно быстро так или иначе.

Это немного тривиально, но это фиксирует мою самую большую жалобу с C#.

В целом, я думаю, что это - фантастическая идея и вероятно украдет его.

5
ответ дан David 24 November 2019 в 18:32
поделиться

Я не сказал бы, что это является злым, но я интересуюсь тем, как Ваш дополнительный метод согласуется с

protected virtual OnSomeEvent(EventArgs e){ }

шаблон и как это обрабатывает расширяемость через наследование. Это предполагает, что все подклассы обработают событие вместо переопределения метод?

0
ответ дан Greg D 24 November 2019 в 18:32
поделиться

Хотя я бы не назвал его злом , он все же имеет отрицательные последствия, поскольку добавляет ненужные накладные расходы:

При вызове

myEvent.Raise (this, new EventArgs () );

объект EventArgs инициализируется во всех ситуациях, даже если никто не подписался на myEvent.

При использовании

if (myEvent!= null) {
   myEvent(this, new EventArgs());
}

EventArgs инициализируется только в том случае, если кто-то подписался на myEvent.

0
ответ дан 24 November 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: