2012-04-25 7 views
6

Ich schreibe ein Spiel mit C# und habe eine Reihe von Fällen gefunden, in denen eine Funktion einen Delegaten akzeptiert und ich versehentlich einen Funktionsnamen übergeben habe, anstatt einen Delegaten zu erstellen und zwischenzuspeichern, der stattdessen als Parameter verwendet wird. Dies führt dazu, dass für jeden Aufruf dieser Funktionen ein Delegatobjekt erstellt wird, das bei der Rückgabe der Funktion sofort zu einem Papierkorb wird.Wie vermeiden oder erkennen Sie implizite Delegat Inferenz in C#?

Ich würde gerne alle Orte finden, wo ich diesen Fehler gemacht habe, und ich würde es vorziehen, jede Zeile jeder Datei zu vermeiden, die nach ihnen sucht (es gibt Jahre Code). Ich habe gesehen, wie VB eine "Option strict" hat, die implizite Konstruktion von Objekten deaktiviert, was meiner Meinung nach für mich funktionieren würde, wenn C# diese Funktion hätte, aber ich glaube nicht, dass dies der Fall ist. Ich habe auch die Warnungsoptionen des Compilers überprüft, und auch hier scheint keiner davon zu helfen.

Gibt es eine einigermaßen bequeme Möglichkeit, diese durch implizite Delegaten-Inferenz erzeugten Objekte zu identifizieren, damit ich herausfinden kann, wo ich die Callbacks erstellen/zwischenspeichern muss, um den Müll zu vermeiden?

+1

Gibt es einige Code-Beispiele Sie, wo zum Beispiel zur Verfügung stellen können, ein Visual Studio regex suchen könnten sie finden? – mellamokb

+0

Nur so sehe ich, wenn finden Sie die Methode/Funktion, die einen Delegaten akzeptiert, dann mit der rechten Maustaste-> finden Sie Referenzen (obwohl dies bedeutet, jeden Aufruf manuell zu überprüfen). –

+1

Haben Sie irgendwelche Beweise, dass dies tatsächlich ein Problem verursacht? Ich würde erwarten, dass die Leistungseinbußen in der überwiegenden Mehrheit der Fälle vernachlässigbar sind, verglichen mit dem Vorteil der Lesbarkeit, dass statt eines expliziten Caching eine Methodengruppenumwandlung verwendet wird. –

Antwort

10

Kurz gesagt, Ihre Frage lautet: "Wie kann ich alle Methodengruppenkonvertierungen finden?"

Wir arbeiten derzeit an einem Projekt mit dem Codenamen Roslyn, mit dem Sie dieselbe semantische Analyse-Engine verwenden können, die der C# -Compiler und die IDE verwenden. Es wird das syntaktische Modell der Sprache verfügbar machen und dann eine semantische Analyse API zur Verfügung stellen, mit der Sie Fragen des semantischen Analysators stellen können.

Mit Roslyn könnten Sie Ihren gesamten Code in Syntaxbäume übersetzen und dann diese Syntaxbäume für jeden Ausdruck durchsuchen. Es wird eine API geben, mit der Sie feststellen können, ob der Ausdruck in irgendetwas konvertiert wurde, und wenn ja, wie der Umwandlungsanalysator die Umwandlung klassifiziert hat.

Wir sind derzeit in der "Community Technology Preview" Bühne; Wir haben eine vorläufige Implementierung, aber es ist noch nicht annähernd voll funktionsfähig. Ich erinnere mich nicht, ob der Methodengruppen-Konvertierungsanalysator in der CTP-Version implementiert wurde oder nicht.

Probieren Sie es aus, und wenn Sie Feedback dazu haben, würden wir gerne Ihre Meinung zum Roslyn Forum hören. hier

Details:

http://msdn.microsoft.com/en-us/roslyn

+0

Danke, ich habe mich aus einer Reihe von Gründen auf das Roslyn-Projekt gefreut. Ich füge dieses in die Liste der Dinge ein, die ich checken sollte, wenn ich etwas Zeit damit verbringen kann. –