Зачем использовать EventArgs.Пустой вместо null?



Я помню, что читал, в нескольких случаях и в нескольких местах, что при запуске типичного события:



protected virtual OnSomethingHappened()
{
this.SomethingHappened(this, EventArgs.Empty);
}


e должно быть EventArgs.Пусто, если нет интересных событий args, а не null.



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




  1. почему заявленный контракт предпочитает
    EventArgs.Пустой над нулем?

  2. какие ситуации в моем собственном
    код оправдать подобную конструкцию
    решение? Когда я должен рассмотреть
    создание некоторого статического " ничего
    интересно здесь " недвижимость вместо
    использование null для указания отсутствия
    о чем-то интересном?

  3. повлияло ли добавление типов значений с нулевым значением на эти решения?

623   6  

6 ответов:

Я считаю, что аргументация за NOT NULL заключается в том, что при передаче в качестве параметра не ожидается, что метод должен потенциально обрабатывать исключение null reference.

Если вы передаете null, и метод пытается что-то сделать с e, он получит исключение null reference с EventArgs.Пустым он не будет.

EventArgs.Empty экземпляр нулевой объект шаблона.

в основном, имея объект, представляющий "нет значения", чтобы избежать проверки на null при его использовании.

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

Mitchel Sellers опубликовал другую половину моей причины на полпути через мой пост: он предотвращает исключение нулевой ссылки, если метод попытается что-то сделать с этим аргументом (кроме проверки, если он равен нулю).

EventArgs.Пустой в основном делает работу глобально определенного аргумента события без каких-либо дополнительных информация.

редактировать

чтобы дать аналогичный пример поддержания конвенции-наша команда использует string.empty для инициализации строки b / c в противном случае разные кодеры могут использовать newString = ""; or newString = " "; or newString = null;

все из которых могут дать различные результаты для различных условий проверки.

редактировать #2

a (слегка педантичная) причина для использования EventArgs.Пустой Vs new EventArgs () заключается в том, что первый не инициализирует новый EventArgs, сохраняя небольшое количество память.

если вы используете универсальный метод, который имеет EventHandler подпись, которая вызывается из любого обработчика событий и передается как object sender и EventArgs e, оно может вызвать e.ToString(), например, для регистрации событий, не беспокоясь об исключении нулевого указателя.

Я долгое время использовал "new EventArgs()" вместо "EventArgs.Пустой.".. Я думаю, что важно передать что-то, что не вызовет нулевое исключение.

из книги Albahari: "in order to avoid unnecessarily instantiating an instance of EventArgs."

Comments

    Ничего не найдено.