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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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