[c#] Visual Studio 디버깅 “빠른 조사”도구 및 람다 식

“빠른 조사”창에서 디버깅하는 동안 람다 식을 사용할 수없는 이유는 무엇입니까?

UPD : 참조

http://blogs.msdn.com/b/jaredpar/archive/2009/08/26/why-no-linq-in-debugger-windows.aspx

http://blogs.msdn.com/b/jaredpar/archive/2010/06/02/why-is-linq-absent-from-debugger-windows-part-2.aspx



답변

익명 메서드와 마찬가지로 Lambda 식은 실제로 매우 복잡한 짐승입니다. 제외하더라도 Expression(.NET 3.5) 여전히 많은 복잡성을 남깁니다. , 약간의 연기와 거울이 있습니다.

따라서이 마법을 지원 하는 많은 컴파일러 작업 (및 뒤에서 유형 생성)이 있습니다.


답변

아니요, 감시 / 지역 / 직접 창에서 람다 식을 사용할 수 없습니다. Marc가 지적했듯이 이것은 매우 복잡합니다. 그래도 주제에 대해 좀 더 자세히 알아보고 싶었습니다.

대부분의 사람들이 디버거에서 익명 함수를 실행할 때 고려하지 않는 것은 진공 상태에서 발생하지 않는다는 것입니다. 익명 함수를 정의하고 실행하는 바로 그 행위는 코드베이스의 기본 구조를 변경합니다. 일반적으로 특히 즉각적인 창에서 코드를 변경하는 것은 매우 어려운 작업입니다.

다음 코드를 고려하십시오.

void Example() {
  var v1 = 42;
  var v2 = 56;
  Func<int> func1 = () => v1;
  System.Diagnostics.Debugger.Break();
  var v3 = v1 + v2;
}

이 특정 코드는 v1 값을 캡처하기 위해 단일 클로저를 생성합니다. 익명 함수가 범위 밖에서 선언 된 변수를 사용할 때마다 클로저 캡처가 필요합니다. 모든 의도와 목적을 위해 v1은 더 이상이 기능에 존재하지 않습니다. 마지막 줄은 실제로 다음과 비슷합니다.

var v3 = closure1.v1 + v2;

Example 함수가 디버거에서 실행되면 Break 라인에서 중지됩니다. 이제 사용자가 감시 창에 다음을 입력했다고 상상해보십시오.

(Func<int>)(() => v2);

이를 제대로 실행하기 위해 디버거 (또는 더 적절한 EE)는 변수 v2에 대한 클로저를 생성해야합니다. 이것은 어렵지만 불가능하지는 않습니다.

이것이 EE에게 정말 힘든 일을 만드는 것은 마지막 라인입니다. 이제 그 라인을 어떻게 실행해야합니까? 모든 의도와 목적을 위해 익명 함수는 v2 변수를 삭제하고이를 closure2.v2로 대체했습니다. 따라서 코드의 마지막 줄은 이제 실제로 읽어야합니다.

var v3 = closure1.v1 + closure2.v2;

그러나 실제로 코드에서이 효과를 얻으려면 EE가 실제로 ENC 작업 인 코드의 마지막 줄을 변경해야합니다. 이 특정 예는 가능하지만 시나리오의 좋은 부분은 그렇지 않습니다.

더 나쁜 것은 람다 표현식이 새로운 클로저를 생성하지 않아야한다는 것입니다. 실제로 원래 클로저에 데이터를 추가해야합니다. 이 시점에서 ENC 한계로 곧장 실행됩니다.

내 작은 예는 불행히도 우리가 직면 한 문제의 표면을 긁는 것뿐입니다. 이 주제에 대한 전체 블로그 게시물을 작성하겠다고 계속 말하고 이번 주말에 시간이 있기를 바랍니다.


답변

직접 실행 또는 조사 식 창에서는 람다 식을 사용할 수 없습니다.

그러나 .Where ( “Id = @ 0”, 2) 형식을 취하는 System.Linq.Dynamic 식을 사용할 수 있습니다. 표준 Linq에서 사용할 수있는 전체 메서드 범위가없고 전체가 없습니다. 람다 식의 힘이지만 여전히 아무것도없는 것보다 낫습니다!


답변

미래가 왔습니다!

람다 식 디버깅에 대한 지원이 Visual Studio 2015 에 추가되었습니다 ( 작성 당시 미리보기 ).

Expression Evaluator를 다시 작성해야했기 때문에 ASP.NET 원격 디버깅, 직접 실행 창에서 변수 선언, 동적 변수 검사 등 많은 기능이 누락되었습니다. 또한 네이티브 함수를 호출해야하는 람다 식은 현재 지원되지 않습니다.


답변

도움이 될 수 있습니다 : Visual Studio 용 확장 직접 실행 창 (디버깅에서 Linq, Lambda Expr 사용)

최선을 다해, Patrick


답변

람다 식은 디버거의 식 평가 기에서 지원되지 않습니다. 컴파일 타임에식이 아닌 메서드 (또는 식 트리)를 생성하는 데 사용되기 때문에 놀라운 일이 아닙니다 (디스플레이가. 그들을 참조하십시오).

물론 그들은 폐쇄, 또 다른 전체 구조 층을 형성 할 수 있습니다.


답변

VS 2015에서는 지금 그렇게 할 수 있습니다. 이것은 그들이 추가 한 새로운 기능 중 하나입니다.