使用.GetType()可能多次枚举IEnumerable警告

本文关键字:枚举 IEnumerable 警告 GetType 使用 | 更新日期: 2023-09-27 18:20:35

我收到ReSharper警告"IEnumerable的可能多重枚举",代码如下:

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

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

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

有什么建议吗?

提前谢谢。

使用.GetType()可能多次枚举IEnumerable警告

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

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

这可能是问题,也可能不是问题,这取决于entities代表什么以及您对它执行的操作。如果它代表内存中的数组,或者您执行的操作不在列表上迭代,则无需太担心。如果您对它进行迭代,并且它表示一个将进入数据库的查询,那么最好显式枚举它(通过调用ToListToArray),并根据结果执行操作。