2009-08-19 4 views
25

Ich habe in anderen Fragen gesehen, dass die Linq-Abfragesyntax zu einem Lambda kompiliert wird.Warum können Sie das Debuggen nicht bearbeiten und fortsetzen, wenn in der Methode ein Lambda-Ausdruck vorhanden ist?

Warum können Sie nicht edit-and-continue wenn es einen Lambda-Ausdruck in der Methode gibt, während mit Abfrage Notation können Sie?

Was ist am meisten ärgerlich und ernst macht mich überall zu verwenden Abfrage Notation Schalt betrachten, ist, dass selbst wenn der Code nicht in der Lambda ist, aber es gibt eine Lambda woanders in der gleichen Methode können Sie nicht edit-and-continue! Das sind unnötige Schmerzen, die unachtsamen Entwicklern zugefügt werden!

+0

Einverstanden. Ich benutze Edit-and-Continue viel, aber jetzt, dass ich lambdas viel benutze, hat es diese Funktion irgendwie getötet. –

+1

mögliches Duplikat von [Warum kann ich keine Methode bearbeiten, die eine anonyme Methode im Debugger enthält?] (Http://stackoverflow.com/questions/581967/why-can-i-not-edit-a-method-that -contains-an-anonyme-Methode-im-Debugger) – nawfal

+1

Für diejenigen, die 2016 lesen, können Sie dies jetzt in VS2015 tun. Es gibt immer noch einige Einschränkungen, aber im Großen und Ganzen haben sie großartige Arbeit geleistet. – matrixugly

Antwort

20

Edit und Continue ist in der Lage, Methodenimplementierungen "live" zu ändern, aber nicht, welche Felder in Typen sind.

Lambda-Ausdrücke (und anonyme Methoden) können am Ende ihre eigenen privaten Typen erstellen, wenn sie Variablen erfassen. Das Ändern des Lambda-Ausdrucks kann die beteiligten Typen ändern, wodurch die Bearbeitung unterbrochen und fortgesetzt wird.

Es klingt wie es sollte möglich sein, den Code, um Änderungen an, die diese Wirkung nicht haben, aber ich vermute, dass es einfach leichter ist es ganz zu verhindern - was auch bedeutet, Sie dies nicht tun Start Änderungen vornehmen und dann finden Sie, dass Sie auf halbem Weg durch Ihre Änderung verhindert werden.

(Ich persönlich bin kein Fan von E & C an erster Stelle, also habe ich es nie bemerkt.)

+4

Danke. Warum magst du E & C nicht? Was machst du stattdessen? –

+9

Ich bevorzuge Unit-Tests. Dann muss ich mir keine Gedanken mehr über den Neustart machen - was bedeutet, dass ich immer neuen Code von Anfang bis Ende benutze. –

+0

Gute Erklärung, danke –

0

Ich weiß nicht sicher, aber meine Vermutung ist, die Komplexität um herauszufinden, heraus, was geändert werden muss, wenn lokale Variablen betroffen sind, die in Klassen aufgenommen werden. Ich schätze, dass das Herausfinden, welche Änderungen sicher wären und was nicht, für komplex und fehleranfällig gehalten wurde, um an dieser Stelle richtig zu werden. Die Werkzeuge im Jahr 2010 konzentrierten sich auf Threading und die neue Benutzeroberfläche - vielleicht werden wir es in der nächsten Version bekommen.

+0

warum? Solange Sie die Methode nicht selbst debuggen, würden Sie denken, dass eine neue IL ausgegeben würde und die JIT würde ihre Sache tun, wenn sie benötigt wird. Es ist nicht wie, sagen wir C++, wo E & C funktioniert, obwohl man denkt, dass es härter arbeiten muss. – gbjbaanb

0

Ich weiß es nicht sicher, aber ich nehme an, es hat mit der Art und Weise zu tun, wie der Compiler Lambda-Ausdrücke konvertiert Closures in compilergenerierte Klassen. Wahrscheinlich gibt es keine (einfache) Möglichkeit, Änderungen am kompilierten Code vorzunehmen und den aktuellen Zustand beizubehalten.