visual studio -有可能“看到”吗?到c# foreach循环的迭代集合中

本文关键字:循环 foreach 迭代 集合 有可能 studio 看到 visual | 更新日期: 2023-09-27 17:48:57

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

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

似乎没有任何东西可以让我悬停以获得GetItems返回的计算项集,即使它是明确计算和返回的,以便循环能够执行。

似乎是很方便的东西。我错过什么了吗?必须重写代码以将列表存储在变量中,以便在调试时可以看到它,这是一种痛苦,特别是当我发现一个不容易重现的错误时。

visual studio -有可能“看到”吗?到c# foreach循环的迭代集合中

一种选择是在循环之前将其赋值给一个临时变量。

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

这将允许您直接检查items

,尽管它是为了使循环能够执行而明确计算并返回的。

问题是这不是真的。

如果GetItemsIEnumerableIEnumerable<T>,则可能不进行评估。事实上,"集合"可以是一个无限枚举对象。

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

someObject.GetItems(someParameter);

悬停在这种情况下不起作用,但是显式地将它添加到观察窗口中就可以了。在悬停期间求值表达式而不求值函数的代码中有很多需要注意的地方。逻辑是函数是昂贵的,可以使IDE死锁,我们不希望悬停操作导致死锁。这个表达式的GetItems部分是一个函数求值,因此EE拒绝求值。

遗憾的是,Visual Studio调试器没有此功能。

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

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

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

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