Warum sind Delegierte keine leere Liste, wenn kein Abonnent vorhanden ist?

8

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

    
Marcel Gosselin 02.11.2009, 03:02
quelle

4 Antworten

8

Auf der CLR-Ebene sind Delegiertenfelder und Ereignisfelder reguläre Felder.

Genau wie string MyField standardmäßig auf null und nicht auf "" gesetzt ist, so ist Action MyField standardmäßig auf null und nicht auf eine leere Action Instanz.

    
SLaks 02.11.2009, 03:09
quelle
2

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.

    
Andrew Hare 02.11.2009 03:04
quelle
2

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.

    
Matt Davis 02.11.2009 03:56
quelle
0

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:

  1. Abonnement
  2. Abmeldung
  3. Aufruf (sollte _eventName aufrufen, wenn nicht null, sonst nichts tun)

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.

    
supercat 06.06.2012 21:49
quelle

Tags und Links