Я бы сказал, используйте простой делегат; просто - это уже (внутренне) список, поэтому вы дублируете усилия, заключая его в List<T>
. У вас также есть накладные расходы на дополнительные объекты списка и массивы, которые могут быть нулевыми, что больше влияет на сборку мусора и т. Д.
Кроме того, если вы делаете лотов из этого, рассмотрите EventHandlerList
, который существует для обеспечения эффективного доступа к разреженным событиям - то есть, где вы хотите выставить множество событий, но многие из них могут быть не назначены.
Первый пример гораздо ближе к «стандартным» событиям (хотя вы можете захотеть следить за неназначенными / нулевыми обработчиками при вызове Invoke
, поскольку это может быть ноль). Кроме того, обратите внимание, что некоторые языки (я, честно говоря, не знаю, что здесь делает VB) применяют синхронизацию к событиям, но в действительности очень немногие события на самом деле должны быть поточно-ориентированными, так что это может быть избыточным.
edit также бывает, что существует функциональная разница между ними:
- подход делегата обрабатывает разные экземпляры с одинаковым целевым методом / экземпляром как равные (я не думаю, что
List<T>
будет)
- дубликаты делегатов: делегат удаляет последний первым; список удаляет самое раннее первое
- composites: добавьте A, добавьте B и удалите (A + B) - с делегатом это должно привести к нулю / пустому, но подход списка сохранит A и B (при удалении (A + B) не удается найти что-нибудь)