Зачем использовать EventArgs.Empty вместо null? - PullRequest
65 голосов
/ 09 октября 2008

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

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

e должно быть EventArgs.Empty, если нет интересных аргументов события, не ноль.

Я следовал указаниям в своем коде, но понял, что не понимаю, почему это предпочтительный метод. Почему указанный контракт предпочитает EventArgs.Empty, а не null?

Ответы [ 6 ]

33 голосов
/ 09 октября 2008

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

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

27 голосов
/ 04 июня 2009

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

По сути, наличие объекта, представляющего «нет значения», чтобы избежать проверки на ноль при его использовании.

7 голосов
/ 09 октября 2008

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

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

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

Чтобы привести аналогичный пример поддержки соглашения, наша команда использует string.Empty для инициализации строки, потому что в противном случае разные кодеры могут использовать newString = ""; or newString = " "; or newString = null;, и все они могут давать разные результаты для разных условий проверки.

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

2 голосов
/ 09 октября 2008

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

0 голосов
/ 17 марта 2014

из книги Албахари: "in order to avoid unnecessarily instantiating an instance of EventArgs."

0 голосов
/ 09 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...