Während die Delegierten in C# und .NET im allgemeinen Inspektion, bemerkte ich einige interessante Fakten:Delegierte in .NET: Wie sind sie aufgebaut?
einen Delegierten in C# erstellen erstellt eine Klasse von MulticastDelegate
mit einem Konstruktor abgeleitet:
.method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed { }
Bedeutung dass es die Instanz und einen Zeiger auf die Methode erwartet. Doch die Syntax eines Delegaten in C# zu konstruieren lässt vermuten, dass es einen Konstruktor hat
new MyDelegate(int() target)
wo ich int()
als Funktion Beispiel erkennen kann (int *target()
wäre ein Funktionszeiger in C++). Offensichtlich wählt der C# -Compiler die richtige Methode aus der durch den Funktionsnamen definierten Methodengruppe aus und baut den Delegaten auf. Die erste Frage wäre also: Woher nimmt der C# -Compiler (oder Visual Studio, um genau zu sein) diese Konstruktorsignatur? Ich habe keine besonderen Attribute oder etwas bemerkt, das einen Unterschied machen würde. Ist das eine Art von Compiler/Visual Studio Magie? Wenn nicht, ist die T (args) target
Konstruktion in C# gültig? Ich habe es nicht geschafft, irgendetwas damit zu kompilieren, z. B .:
int() target = MyMethod;
ist ungültig, so ist irgendetwas mit MyMetod
, z. Rufen Sie .ToString()
darauf an (gut, das macht Sinn, da das technisch eine Methode Gruppe ist, aber ich stelle mir vor, es sollte möglich sein, eine Methode explizit durch Gießen, zB (int())MyFunction
. So ist das alles rein Compiler Magie? mit Blick auf die Konstruktion durch Reflektor zeigt noch eine andere Syntax:
Func CS 1 $ 0000 $ = new Func (null, (IntPtr) Foo);
Dies steht im Einklang mit dem zerlegten Konstruktor Unterschrift, doch ist diese kompiliert nicht!
Eine letzte interessante Anmerkung ist, dass die Klassen Delegate
und MulticastDelegate
noch eine weitere Sätze von Konstrukteuren haben:
beträgt.Verfahren Familie hidebysig specialname rtspecialname Instanz Leere .ctor (Klasse System.Type Ziel, String ‚Methode‘) cil managed
Woher kommt der Übergang von einem Instanz- und Methodenzeiger zu einem Typ und einem String-Methodennamen? Kann dies mit den Schlüsselwörtern runtime managed
in der benutzerdefinierten Delegiertenkonstruktorsignatur erklärt werden, d. H., Ob die Laufzeitumgebung hier ihren Zweck hat?
BEARBEITEN: ok, also denke ich, ich sollte neu formulieren, was ich mit dieser Frage sagen wollte. Im Grunde suggeriere ich, dass es nicht nur C# -Compiler/CLR-Magie bei der Delegiertenkonstruktion gibt, sondern auch einige magische Effekte, da Intellisense eine neue Syntax ausgibt, wenn sie die Konstruktorargumente vorschlägt und sogar einen davon versteckt (zB Reflector) Verwenden Sie diese Syntax und Konstruktor nicht für diese Angelegenheit).
Ich frage mich, ob diese Behauptung wahr ist, und ob die Syntax der Funktionsinstanz in C# eine tiefere Bedeutung hat oder nur ein konstantes Format, das von Visual Studio zur Klarheit implementiert wird (was sinnvoll erscheint, da es so aussieht ungültiges C#)? Kurz gesagt, sollte ich Intellisense implementieren, sollte ich etwas für Delegierte zaubern oder könnte ich den Vorschlag durch einen cleveren Mechanismus konstruieren?
FINAL EDIT: so ist der populäre Konsens, dass das in der Tat VS Magie ist. Wenn man andere Beispiele (siehe Marc Gravells Kommentar) eines solchen VS-Verhaltens sieht, überzeugt es mich, dass dies der Fall ist.
'CS $ 1 $ 0000' ist ein generierter Decompiler, der niemals kompiliert wird. – Dykam
Ich weiß, der Name ist nicht der Punkt hier, es ist die neue Konstruktion, die nicht kompiliert. –
Yah, wollte nur darauf hinweisen. – Dykam