2008-10-09 5 views
57

я помню чтение, в несколько раз и в разных местах, что при стрельбе типичное событие:Зачем использовать EventArgs.Empty вместо null?

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

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

Я следил за инструкциями в своем коде, но я понял, что я не понимаю, почему это предпочтительная техника.

  1. Зачем нужен указанный договор EventArgs.Empty over null?
  2. Какие ситуации в моем собственном код оправдывал бы аналогичный дизайн решение? Когда я должен рассмотреть , создавая некоторое статическое свойство «Nothing интересное здесь» вместо , используя null, чтобы указать на отсутствие чего-то интересного?
  3. Имеет ли значение, связанное с этими значениями, значение типа nullable value?
+0

Отличный вопрос! – 2008-10-09 19:05:31

+0

Спасибо. :) Я только что понял, что в течение этого года я занимаюсь грузовым программированием таким образом, теперь я хочу знать, почему. :) – 2008-10-09 19:08:08

ответ

28

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

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

+0

В каких ситуациях вы бы использовали подобный метод в своем собственном коде? – 2008-10-09 19:49:35

+6

Если один метод может передавать информацию о событиях, а другой - нет. Я все равно могу вызвать e.ToString() независимо, но можно передать нестандартный тип, а другой передает EventArgs.Empty – 2008-10-09 20:07:24

+3

Грег, все дело в том, что обработчик событий * не * ваш код. Сначала вы хотите безопасности, потому что вы определяете и поднимаете событие, а кто-то еще напишет обработчик событий. – 2013-04-16 06:10:28

2

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

5

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

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

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

EDIT

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

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

EDIT # 2

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

0

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

24

EventArgs.Empty является примером Null object pattern.

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

0

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