Зачем использовать EventArgs.Empty вместо null?
Вопрос
Я вспоминаю, как несколько раз и в разных местах читал, что при запуске типичного события:
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. "