有没有可能;见;调试时进入C#foreach循环的迭代集合?

有没有可能;见;调试时进入C#foreach循环的迭代集合?,c#,visual-studio,visual-studio-2010,debugging,foreach,C#,Visual Studio,Visual Studio 2010,Debugging,Foreach,这是我经常希望在调试时能够做到的事情。如果我有一行代码在foreach循环的头中计算集合: foreach ( var item in someObject.GetItems( someParameter ) ) { ... } 似乎没有任何东西可以让我悬停在上面以获取由GetItems返回的计算项目集,即使它是为了循环能够执行而明确计算和返回的 看起来很方便。我错过什么了吗?必须重写代码以将列表存储在变量中,这样我才能在调试时看到它,这是一件痛苦的事情,特别是如果我发现了一个不容易复

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

foreach ( var item in someObject.GetItems( someParameter ) ) {
    ...
}
似乎没有任何东西可以让我悬停在上面以获取由
GetItems
返回的计算项目集,即使它是为了循环能够执行而明确计算和返回的


看起来很方便。我错过什么了吗?必须重写代码以将列表存储在变量中,这样我才能在调试时看到它,这是一件痛苦的事情,特别是如果我发现了一个不容易复制的错误。

一个选项是在循环之前将其分配给一个临时变量

var items = someObject.GetItems( someParameter );
foreach ( var item in items ) {
    ...
}
这将允许您直接检查
项目

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

问题是这不是真的


如果
GetItems
IEnumerable
IEnumerable
,则可能不会对其求值。“集合”实际上可能是无限可枚举的。

Visual Studio调试器没有用于此目的的功能

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

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

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

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

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

someObject.GetItems(someParameter);

在这种情况下,悬停不起作用,但将其显式添加到监视窗口将起作用。在悬停期间对表达式求值的代码中有很多注意事项,以避免对函数求值。逻辑是函数很昂贵,可能会使IDE死锁,我们不希望悬停操作导致死锁。此表达式的
GetItems
部分是函数求值,因此EE拒绝求值

谢谢,如果我需要在不重新启动的情况下检查它,这是一个很好的解决方法。我没想到。为什么在表达式上悬停必须再次求值?当然,如果微软能做到这一点,那将是一个显示已评估值的问题。这将避免再次计算表达式的开销和潜在的副作用。当然,如果一个FACH循环正在进行时,在本地窗口中显示的评估值会更好。虽然这是肯定的,但我不认为它是一个解决方案,因为我的问题是具体如何避免这样做。谢谢你。@chaiguy:我想告诉你为什么没有直接的方法-手表在某些情况下可以工作,但在其他情况下可能有潜在的危险(因为枚举可能有副作用)。事实上,表达式将始终被计算,即使尚未计算完整的集合。因此,应该至少可以看到此计算的结果,即使所述结果是惰性可枚举的。这里有两个不同的问题:(a)在调试器中看到对象被迭代,就像可以看到局部或对象级别变量的值一样(b)在调试期间提取惰性集合的内容。我认为(a)是你试图解决的问题,对吗?