2009-08-19 3 views
25

Я видел, как он сказал в других вопросах, что синтаксис запроса Linq компилируется в Lambda.Почему вы не можете редактировать и продолжать отладку, когда в методе есть выражение Lambda?

Итак, почему вы не можете редактировать и продолжать, когда в методе есть выражение Lambda, в то время как с помощью нотации запроса вы можете?

Что самое бешенство, и серьезно заставляет меня задуматься о переходе на использование обозначения запроса везде, является то, что даже если ваш код не в Lambda, но есть лямбда-нибудь еще в том же методе, вы не можете редактировать-и-продолжения! Вот, например, безвозмездная боль, причиняемая неосторожным разработчикам!

+0

Согласен. Я использовал edit-and-continue много, но теперь я, что я много использую lambdas, он как бы убил эту функцию. –

+1

Возможный дубликат [Почему я не могу редактировать метод, содержащий анонимный метод в отладчике?] (Http://stackoverflow.com/questions/581967/why-can-i-not-edit-a-method-that -contains-an-anonymous-method-in-the-debugger) – nawfal

+1

Для тех, кто читает в 2016 году, вы можете сделать это сейчас в VS2015. Есть еще некоторые ограничения, но в целом они отлично справились. – matrixugly

ответ

20

Редактировать и продолжать вносить изменения в методы реализации «вживую», но не в каких полях в типах.

Лямбда-выражения (и анонимные методы) могут создавать собственные частные типы при захвате переменных. Изменение выражения лямбда может изменить используемые типы, которые нарушат редактирование и продолжаются.

Это звучит, как это должно можно вносить изменения в код, которые не имеют такого влияния, но я подозреваю, что это просто легче предотвратить его полностью - что также означает, что вы не начала внесения изменений и затем обнаружите, что вам не удалось пройти половину пути.

(Лично я не поклонник E & C, в первую очередь, поэтому я никогда не замечал этого.)

+4

Спасибо. Почему вам не нравится E & C? Что вы делаете вместо этого? –

+9

Я предпочитаю использовать модульные тесты. Тогда мне не нужно беспокоиться о перезапуске - это означает, что я всегда использую новый код от начала до конца. –

+0

Хорошо Объяснение, спасибо –

0

Я не знаю точно, но я думаю, сложность вокруг выясняя что необходимо изменить, когда есть локальные переменные, которые поднимаются к классам. Я предполагаю, что выяснение того, какие изменения будут безопасными, и что не будет считаться сложным и подверженным ошибкам, чтобы получить право в этот момент. Инструмент в 2010 году сосредоточился на потоковой обработке и новом интерфейсе - возможно, мы получим его в следующей версии.

+0

Почему? до тех пор, пока вы не отлаживаете сам метод, вы бы подумали, что будет выпущен новый IL, и JIT будет делать что-то, когда это необходимо. Это не похоже, скажем, на C++, где E & C работает, несмотря на то, что вы думаете, что он должен работать усерднее. – gbjbaanb

0

Я не знаю этого точно, но я предполагаю, что он связан с тем, как компилятор преобразует лямбда-выражения, образуя замыкания в классы, сгенерированные компилятором. Вероятно, нет (простого) способа применить изменения к скомпилированному коду и сохранить текущее состояние.