В чем разница между следующим кодом для добавления новых событий - PullRequest
4 голосов
/ 05 марта 2010

- Если я определяю событие с исходным пустым делегатом, мне не нужно проверять на ноль

class MyClass
{
 public event EventHandler<MyEventArgs> MyEvent = delegate { };

 void SomeMethod()
 {
  ...
  MyEvent(); // No need to check for null
  ...
 }
}

- В противном случае мне нужно проверять на ноль

class MyClass
{
 public event EventHandler<MyEventArgs> MyEvent;

 void SomeMethod()
 {
  ...
  if (MyEvent != null) // No need to check for null
   MyEvent(); 
  ...
 }
}

В чем разница между этими?В каких случаях один лучше другого?

Спасибо

Ответы [ 3 ]

3 голосов
/ 05 марта 2010

Поднятый ответ резко неверен, я должен опубликовать ответ. Кто-то не прав в Интернете, пока не может лечь спать.

Это удобно, но не бесплатно. Компилятор должен сгенерировать класс для анонимного метода, а JIT-компилятор должен сгенерировать код для него. И этот код всегда выполняется при возникновении события независимо от того, подписан ли клиент обработчиком события. Нулевой проверочный код также всегда выполняется, но это занимает гораздо меньше времени и кода.

Это не много кода и много времени. Нулевая проверка занимает 2 инструкции машинного кода и должна выполняться за один цикл ЦП. Анонимному делегату требуется на порядок больше, но это не так уж много на современном компьютере. Лично я слишком стар, чтобы быть таким расточительным, два неизменно мой выбор.

Не в последнюю очередь, потому что это стандартный шаблон, все его признают.

2 голосов
/ 05 марта 2010

Первое - применимое решение, но оно вызывает очень незначительное снижение производительности при вызове дополнительного пустого делегата.

Второе решение не является поточно-ориентированным (если это важно для вас, по причине).1004 * Вы должны использовать следующее:

var handler = MyEvent;
if (handler != null )
  handler(this, new MyEventArgs());
1 голос
/ 05 марта 2010

В нашей компании мы написали метод расширения, который подключается к большинству событий и проверяет, является ли он нулевым, перед вызовом.

Мы сократили это:

var handler = MyEvent;
if (handler != null)
{
    handler(...);
}

до

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