如何调试 Lazy<T>?

4

我有一个使用lambda表达式进行初始化的Lazy<T>,在调试时如何查看初始化lambda表达式的内容?我期望能够像Expression类的DebugView一样查看,但是我没有找到类似的工具。

1个回答

4
因为Lazy<T>采用委托,所以没有涉及到Expression类。您的lambda表达式与项目中的任何其他代码一样进行编译,在调试期间不会预览该代码。
Lambda表达式可以编译为IL或转换为Expression Tree。发生哪种情况取决于上下文。如果参数声明为委托,则将生成常规IL代码。如果是Expression<TFunc>,则会得到可以预览的表达式树。
这在MSDN上很好地解释,基于Where方法,它有两个版本:Enumerable.Where采用Func<T, bool>,而Queryable.Where采用Expression<Func<T, bool>>
使用基于方法的语法调用Enumerable类中的Where方法(如在LINQ to Objects和LINQ to XML中所做的那样)时,参数是委托类型System.Func<T, TResult>。Lambda表达式是创建该委托最方便的方法。例如,在调用相同的方法时,System.Linq.Queryable类中的参数类型是System.Linq.Expressions.Expression<Func>,其中Func是任何具有多达十六个输入参数的Func委托之一(如在LINQ to SQL中所做的那样)。同样,Lambda表达式只是构造该表达式树的非常简洁的方法。虽然实际上从Lambda创建的对象类型不同,但Lambda使得Where调用看起来很相似。

所以我有3k个带有不同lambda表达式初始化的Lazy<string>对象。其中一些会导致null。这些lambda包含LINQ表达式,因此我无法设置断点查看发生了什么。当然,我可以以更“断点友好”的方式重写它们,但是...我认为必须有更聪明的解决方案。 - f0rt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接