这是我经常希望在调试时能够做的事情。如果我有一行代码来计算foreach循环标题内的集合:
foreach ( var item in someObject.GetItems( someParameter ) ) {
...
}
似乎没有任何东西可以悬停以获取GetItems
返回的计算项集,即使它已被清楚地计算并返回以便循环能够执行。 / p>
看起来好像很方便。我错过了什么吗?很难重写代码以将列表存储在变量中,这样我就可以在调试时看到它,特别是如果我发现了一个不容易重现的错误。
答案 0 :(得分:9)
一种选择是在循环之前将其分配给临时变量。
var items = someObject.GetItems( someParameter );
foreach ( var item in items ) {
...
}
这样您就可以直接检查items
。
即使它已经清楚地计算并返回,以便循环能够执行。
问题在于这不是真的。
如果GetItems
是IEnumerable
或IEnumerable<T>
,则可能无法对其进行评估。事实上,“集合”可以是无限的可枚举。
答案 1 :(得分:3)
一种方法是将以下表达式添加到监视窗口
someObject.GetItems(someParameter);
悬停不适用于此方案,但明确将其添加到监视窗口中。代码中有很多关注,它在悬停期间评估表达式以不评估函数。逻辑是函数很昂贵,可能会使IDE死锁,我们不希望悬停操作导致死锁。该表达式的GetItems
部分是函数评估,因此EE拒绝对其进行评估。
答案 2 :(得分:1)
不幸的是,Visual Studio调试器没有这方面的功能。
请注意,在一般情况下,它不能。该集合可以是具有复杂计算的迭代器块;你不希望调试器比程序更频繁地评估它。
但是当然有明显的解决方法将集合存储在变量中:
var items = someObject.GetItems( someParameter );
foreach ( var item in items ) {
...
}
现在您可以在调试器中查看items
。当然,同样的限制适用 - 如果它是一个复杂的可枚举,调试器将不会显示一个方便的项目列表。但在常见的情况下(例如列表,数组等)确实如此。