使用.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()"语句被识别为查询。
有什么建议吗?
提前谢谢。
这只是Resharper不够聪明。GetType
不是一个虚拟方法,它不会影响IEnumerable
。
为了调用GetTypes
,需要从ReSharper的角度评估entities
(它不知道GetTypes
是否需要评估枚举,这就是为什么它说"可能多重枚举")。由于ReSharper发现方法中有几个位置存在相同的场景,因此它会发出此警告。
这可能是问题,也可能不是问题,这取决于entities
代表什么以及您对它执行的操作。如果它代表内存中的数组,或者您执行的操作不在列表上迭代,则无需太担心。如果您对它进行迭代,并且它表示一个将进入数据库的查询,那么最好显式枚举它(通过调用ToList
或ToArray
),并根据结果执行操作。