Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

из книги Албахари: " во избежание ненужного создания экземпляра экземпляра EventArgs. "

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top