tl; dr: Perché gli eventi di tipo campo sono implementati come un singolo campo delegato? Non sarebbe più semplice usare un elenco di delegati, eliminando così il caso speciale null
ed evitando tutte le magie di MulticastDelegate?
Il solito schema per aumentare gli eventi di tipo campo (ignorando i problemi di sincronizzazione per il momento) è
if (MyEvent != null)
MyEvent(this, e);
che può essere abbastanza confuso ( Perché ho un controllo nullo per 0 gestori, ma nessun ciclo per più gestori? ), finché non capisci come vengono implementati eventi simili a campi e che MyEvent
fa riferimento a un campo di backup automatico che può contenere null
, un singolo delegato o < a href="https://msdn.microsoft.com/en-us/library/ms173172.aspx"> un MulticastDelegate contenente riferimenti a più gestori .
A prima vista, questa sembra essere una strana scelta di design. In particolare, l'alternativa ovvia sarebbe utilizzare un elenco di delegati semplici, che è il modo in cui il pattern Observer è comunemente implementato in linguaggi come Java. È vero, l'invocazione sarebbe leggermente più lunga:
foreach (var handler in MyEvent)
handler(this, e);
ma sarebbe più facile da capire (secondo la mia opinione soggettiva) e probabilmente più facile da implementare (non c'è bisogno di tutta la logica multicasting delegata).
Ovviamente, i progettisti di C # hanno pensato diversamente. Dal momento che sono un gruppo di persone molto intelligenti, ci deve essere stata una buona ragione per questo. Che cos'è?