4

我使用以下代码收到 ReSharper 警告“IEnumerable 的可能多重枚举”:

public void Mymethod(IEnumerable<int> entities)
{
   var enumerator = entities.GetEnumerator();
   var entityType = entities.GetType();
}

正如在许多 stackoverflow-topics 中描述的(以及在http://confluence.jetbrains.net/display/ReSharper/Possible+multiple+enumeration+of+IEnumerable上)ReSharper 识别出查询运行了两次。

我的问题是,为什么“GetType()”语句被识别为查询。

有什么建议吗?

提前致谢。

4

2 回答 2

3

只是 Resharper 不够聪明。GetType不是虚拟方法,它不会影响IEnumerable.

于 2012-01-17T08:33:39.883 回答
0

为了GetTypes被调用,entities需要从 ReSharper 的角度进行评估(它不知道是否GetTypes需要评估枚举,这就是为什么它说“可能的多个枚举”)。由于 ReSharper 发现方法中有多个位置存在相同的场景,因此会发出此警告。

这可能是也可能不是问题,具体取决于entities您在其上执行的操作和代表什么。如果它表示内存中的数组,或者您执行的操作不会遍历列表,则不必担心。如果您对其进行迭代,并且它表示将转到数据库的查询,那么显式枚举它(通过调用ToListor ToArray)并对其结果采取行动可能会很好。

于 2012-01-17T08:28:47.190 回答