Gibt es einen Delegaten, der kein MulticastDelegate in C # ist?

8

Ich denke, die Antwort ist NEIN? Wenn nicht, warum haben wir Delegate und MulticastDelegate Klassen getrennt? Vielleicht ist es wieder wegen "einiger anderer .NET-Sprachen"?

    
Danny Chen 17.01.2011, 08:06
quelle

4 Antworten

13

EDIT: Ich dachte das war ein Teil von ECMA 335, aber ich kann es nirgends dort sehen.

Sie können keinen solchen Delegattyp in C # erstellen, aber Sie können in IL:

%Vor%

Der C # -Compiler hat keine Probleme mit einem solchen Delegaten:

%Vor%

Aber die CLR versucht es zu laden:

  

Nicht behandelte Ausnahme: System.TypeLoadException: Der Typ 'Foo' konnte nicht aus Assembly 'Foo, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null' geladen werden, da er nicht direkt von der Delegate-Klasse erben kann.      bei Test.Main ()

Grundsätzlich ist die Delegate / MulticastDelegate-Trennung ein historischer Unfall. Ich glaube, dass frühe Alpha- / Beta-Versionen die Unterscheidung gemacht haben, aber es erwies sich als zu verwirrend und im Allgemeinen nicht nützlich - also leitet jeder Delegierte von MulticastDelegate ab.

(Interessanterweise erwähnt die C # -Spezifikation nur einmal MulticastDelegate in der Liste der Typen, die nicht als generische Einschränkungen verwendet werden können.)

    
Jon Skeet 17.01.2011, 08:13
quelle
2

Nein, das ist nicht so, weil alle Delegierten natürlich Delegate.Combine ed sein können. Delegat ist dort einfach, um die Nicht-Multicasting-Funktionalität in eine Basisklasse einzubinden.

    
Mehrdad 17.01.2011 08:09
quelle
2

System.MuticastDelegate wird von System.Delegate abgeleitet. Jede Ebene in der Delegatenhierarchie stellt eine andere Gruppe von Diensten bereit. System.Delegate ist ein Container mit den Daten, für welche Methode ein bestimmtes Objekt aufgerufen werden soll. Mit System.MulticastDelegate können Sie nicht nur eine Methode für ein einzelnes Objekt, sondern für eine Objektgruppe aufrufen. Dies ermöglicht mehrere Abonnenten für ein Ereignis.

Nicht sicher, ich habe Ihre Frage beantwortet.

    
KBBWrite 17.01.2011 08:19
quelle
1

Nein, die CLR erlaubt das nicht.

Ich erinnere mich an etwas, das Delegate direkt verfügbar machen wollte, aber das wurde nie gebraucht.

    
leppie 17.01.2011 08:09
quelle