是否有可能在调试时“看到”C#foreach循环的迭代集合?

时间:2011-04-05 15:59:47

标签: c# visual-studio visual-studio-2010 debugging foreach

这是我经常希望在调试时能够做的事情。如果我有一行代码来计算foreach循环标题内的集合:

foreach ( var item in someObject.GetItems( someParameter ) ) {
    ...
}

似乎没有任何东西可以悬停以获取GetItems返回的计算项集,即使它已被清楚地计算并返回以便循环能够执行。 / p>

看起来好像很方便。我错过了什么吗?很难重写代码以将列表存储在变量,这样我就可以在调试时看到它,特别是如果我发现了一个不容易重现的错误。

3 个答案:

答案 0 :(得分:9)

一种选择是在循环之前将其分配给临时变量。

var items = someObject.GetItems( someParameter );
foreach ( var item in items ) {
    ...
}

这样您就可以直接检查items

  

即使它已经清楚地计算并返回,以便循环能够执行。

问题在于这不是真的。

如果GetItemsIEnumerableIEnumerable<T>,则可能无法对其进行评估。事实上,“集合”可以是无限的可枚举。

答案 1 :(得分:3)

一种方法是将以下表达式添加到监视窗口

someObject.GetItems(someParameter);

悬停不适用于此方案,但明确将其添加到监视窗口中。代码中有很多关注,它在悬停期间评估表达式以不评估函数。逻辑是函数很昂贵,可能会使IDE死锁,我们不希望悬停操作导致死锁。该表达式的GetItems部分是函数评估,因此EE拒绝对其进行评估。

答案 2 :(得分:1)

不幸的是,Visual Studio调试器没有这方面的功能。

请注意,在一般情况下,它不能。该集合可以是具有复杂计算的迭代器块;你不希望调试器比程序更频繁地评估它。

但是当然有明显的解决方法将集合存储在变量中:

var items = someObject.GetItems( someParameter );
foreach ( var item in items ) {
    ...
}

现在您可以在调试器中查看items。当然,同样的限制适用 - 如果它是一个复杂的可枚举,调试器将不会显示一个方便的项目列表。但在常见的情况下(例如列表,数组等)确实如此。