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