【问题标题】:Possible multiple enumeration of IEnumerable warning by using .GetType()使用 .GetType() 可能对 IEnumerable 警告进行多次枚举
【发布时间】:2012-02-12 01:52:17
【问题描述】:

我收到 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()”语句被识别为查询。

有什么建议吗?

提前致谢。

【问题讨论】:

  • 我很确定它指的是enumerator 行。它可能正在寻找相应的Dispose() 调用。
  • 我收到两个语句的警告。如果我只调用 .GetType() 两次而不是 .GetEnumerator(),也会发生这种情况
  • @AakashM:感谢您在跟踪器中提交。看起来错误将在下一个版本中修复。我期待更新;-)

标签: c# linq resharper enumerator gettype


【解决方案1】:

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

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

【讨论】:

  • entities 是处于某种状态的对象。对object.GetType 的调用如何更改此状态?
  • @dtb:我有点不清楚;这是从 ReSharper 的角度来看的。感谢您指出这一点,我更新了答案以澄清这一点。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    相关资源
    最近更新 更多