Kann jemand erklären, warum das .Net-Framework-Team entschieden hat, dass ein Delegat ohne Abonnenten null sein sollte und nicht ein Objekt mit einer leeren InvocationList? Ich würde gerne die Gründe kennen, die zu dieser Entscheidung geführt haben.
%Vor%Danke
Ich stimme zu, dass dies mühsam sein kann und ich persönlich denke, dass dies ein Fehler war. Ich kann mir keinen Grund vorstellen, warum das so sein muss.
Siehe Jon Skeets Antwort hier für eine nette Diskussion darüber . Es ist sogar möglich, in C # 2.0 gegen Null zu gehen.
Die Verwendung von null zur Verarbeitung einer leeren Liste ist zur Laufzeit effizient, zumal die meisten Ereignisse entweder null oder einen Abonnenten haben. Der Fehler in C # ist nicht die Verwendung von null
zur Behandlung einer leeren Liste, sondern die Tatsache, dass sich der Ereignisname in vielen Kontexten auf den Delegaten und nicht auf das Ereignis bezieht. Ein besseres Design hätte den Delegaten mit einem vorangestellten Unterstrich oder einem anderen Präfix benannt und dann nur bestimmte Operationen mit dem Ereignisnamen erlaubt:
Für alle anderen Ereignisoperationen müsste man _eventName
verwenden. Solch ein Entwurf hätte unzählige Tausende (wenn nicht Millionen) Codezeilen gespeichert, verglichen mit dem Erfordernis, Benutzercode zum Kopieren des Ereignisdelegaten zu benötigen, test, wenn null, und rufen die Kopie auf, falls nicht.