我正在处理许多类型为Action<>
和Func<>
的lambda表达式,这些表达式正在向下传递参数,我发现很难跟踪这些变量所代表的实际代码。在Locals
窗口或Watch
窗口调试期间可以看到这些lambdas的实际代码?
恩。 Action<Exception, int> doNothing = (_, __) => { };
当doNothing
作为参数向下传递方法时,我希望在(_, __) => { }
或Locals
窗口的某处显示Watch
。
答案 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被编译成某种类型的方法。你能“看到”调试器中方法的实现吗?否。