是否可以在Visual Studio中的Locals或Watch窗口中实际看到lambda的表达式?

时间:2018-05-28 19:43:14

标签: c# .net visual-studio

我正在处理许多类型为Action<>Func<>的lambda表达式,这些表达式正在向下传递参数,我发现很难跟踪这些变量所代表的实际代码。在Locals窗口或Watch窗口调试期间可以看到这些lambdas的实际代码?
恩。 Action<Exception, int> doNothing = (_, __) => { };doNothing作为参数向下传递方法时,我希望在(_, __) => { }Locals窗口的某处显示Watch

1 个答案:

答案 0 :(得分:1)

您无法直接查看代理的内容。他们的目的是在调用Invoke时不知道他们自己会做些什么。

Action a = () => Console.WriteLine(); // getting "Console.WriteLine()" from "a" is not possible.

但调试器可以帮助你弄清楚lambda是什么。

您可以在“立即”窗口中编写表达式来评估它们。

Func<int, int> negate = x => -x; // let's say you can't see this line but you know "negate" exists.
// in Immediate window, you can write the following
// negate.Invoke(1) // -1
// negate.Invoke(-1) // 1
// then you can guess that "negate" will negate the number, though not conclusively

但是,我认为最好的方法是追溯您的代码以查看该代理的来源。这样,您就可以找到添加到委托中的原始方法/ lambda。

您提到委托作为参数传递给方法。这意味着您可以向下查看堆栈跟踪并查看调用该方法的方法。代表可能在那里创建。如果没有,请再次向下看堆栈,直到找到它为止。

如果委托存储在字段/属性中,那么您必须搜索何时设置该字段/属性,这可能很难。

编辑:

请参阅此帖子:What are C# lambda's compiled into? A stackframe, an instance of an anonymous type, or?

基本上,Lambdas被编译成某种类型的方法。你能“看到”调试器中方法的实现吗?否。