能否在Visual Studio的Locals/Watch窗口查看Lambda表达式的代码内容?
这个问题我之前调试的时候也踩过坑——Lambda作为参数传递后,默认在Locals或Watch窗口里只能看到类型信息,根本看不到写的(_, __) => { }这种实际代码。不过有几个实用的办法能帮你解决:
用Visual Studio的“原始视图”看IL代码
选中Locals/Watch窗口里的Lambda变量,展开它的Target属性,找到Method节点。右键点击变量选择**“显示原始视图”**(英文是Raw View),再展开__method->Body,这里能看到Lambda对应的IL指令。虽然不是直接的C#代码,但结合上下文基本能推断出逻辑,比如空Lambda的IL会很简单。在Watch窗口里用反射命令查方法信息
在Watch窗口输入你的Lambda变量名.Method.ToString(),比如doNothing.Method.ToString(),回车后会显示编译器生成的方法签名,比如Void <Main>b__0(System.Exception, Int32)。这个签名里的<Main>就是定义Lambda的方法名,b__0是编译器给Lambda的编号,能帮你快速定位到对应的代码位置。给Lambda“留个痕迹”(最省心的办法)
别直接把Lambda当参数传递,先把它赋值给一个具名局部变量,比如:Action<Exception, int> doNothing = (_, __) => { }; SomeMethod(doNothing);调试时在Locals窗口找到
doNothing,右键选择**“转到定义”**,Visual Studio会直接跳转到你写Lambda的代码行,一眼就能看到内容。如果是临时写的Lambda,哪怕加个没用的注释,也能帮你在调试时更快识别。借助第三方调试插件(进阶方案)
像OzCode这类第三方调试工具,专门优化了Lambda的调试体验,能直接在调试窗口显示Lambda的原始C#代码,不用折腾IL或者反射。不过这是付费工具,要是公司有授权可以试试,能省不少事。
另外要注意:一定要用Debug模式调试,并且关闭项目属性里的“优化代码”选项——Release模式下编译器会内联Lambda或者做代码优化,调试器根本抓不到完整的Lambda信息。
内容的提问来源于stack exchange,提问作者newprint

