Почему делегаты нулевые, а не пустой список, когда нет подписчика? - PullRequest
8 голосов
/ 02 ноября 2009

Может кто-нибудь объяснить, почему команда .Net Framework решила, что делегат без подписчиков должен быть нулевым, а не объектом с пустым InvocationList? Я хотел бы знать обоснование, которое привело к этому решению.

void DoSomething()
{
    EventHandler handler = SomeEvent;
    if(handler != null)                   //why is this null-check necessary?
    {
        handler(this, EventArgs.Empty);
    }
}

Спасибо

Ответы [ 4 ]

8 голосов
/ 02 ноября 2009

На уровне CLR поля делегатов и поля событий являются обычными полями.

Так же, как string MyField по умолчанию null, а не "", так и Action MyField по умолчанию null, а не пустой экземпляр Action.

2 голосов
/ 02 ноября 2009

См. Ответ Джона Скита здесь для хорошего обсуждения этого. В C # 2.0 можно даже обойтись без проверки на нуль.

2 голосов
/ 02 ноября 2009

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

0 голосов
/ 07 июня 2012

Использование null для обработки пустого списка эффективно во время выполнения, тем более что подавляющее большинство событий имеют либо ноль, либо одного подписчика. Недостатком в C # является не использование null для обработки пустого списка, а скорее тот факт, что во многих контекстах имя события относится к делегату, а не к событию. В лучшем дизайне делегат получил бы имя с предшествующим подчеркиванием или другим префиксом, а затем разрешил бы только определенные операции с именем события:

  1. Подписка
  2. отписка
  3. Вызов (должен вызывать _eventName, если не ноль, иначе ничего не делать)

Для всех других операций с событиями нужно будет использовать _eventName. Такой дизайн позволил бы сэкономить бесчисленные тысячи (если не миллионы) строк кода по сравнению с требованием пользовательского кода для копирования делегата события, проверки нулевого значения и вызова копии, если нет.

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