【问题标题】:Why does Resharper Recommend foreach Instead of for Loop?为什么 Resharper 推荐 foreach 而不是 for Loop?
【发布时间】:2013-12-10 12:27:26
【问题描述】:

Microsoft 文档:“代码审查:.NET 应用程序性能” (http://msdn.microsoft.com/en-us/library/ff647802.aspx) 建议使用“for”循环而不是 foreach 循环来提高性能。

你使用 foreach 吗?

使用 foreach 可能会因为方式而导致额外的开销 枚举在 .NET Framework 集合中实现。 。网 Framework 1.1 集合为 foreach 提供了一个枚举器 通过覆盖 IEnumerable.GetEnumerator 来使用的语句。
...
考虑使用 for 循环而不是 foreach 来提高迭代 .NET Framework 集合的性能用整数索引。

每次用户在循环中单击网格中的一行时,我的应用程序都会进行昂贵的调用。 从浮点值转换为将在监视器中可视化的颜色大约需要 200 万次迭代。

我不确定使用 for 循环代替 foreach 循环,因为 Resharper 在每个可以转换为 foreach 循环的 for 循环中都会发出警告。

1.为什么 Resharper 推荐 foreach 而不是 for Loop?
2、使用for循环安全吗?

【问题讨论】:

  • 1) 因为它更 generic (它几乎适用于任何集合,而不仅仅是集合)但是否使用它(因为性能)它是你所拥有的自己决定(resharper 不可能那么聪明地知道您的收藏有多少项目,它被调用的频率以及它是否对性能至关重要)。 2) 是的,它非常安全(但与少数类型的集合和数组相关联)。
  • 认为编译器无论如何都会在某些情况下将 foreach 转换为 for,例如如果它在编译时知道被 foreach 处理的是一个数组。跨度>
  • "Resharper 发出警告" - 它实际上是一个警告吗?或者它实际上是一个上下文操作(ReSharper 说它可以为你做,如果你愿意)?

标签: c# loops collections foreach resharper


【解决方案1】:
  • 性能更快!
  • Foreach 可以用作强类型集合 很简单!
  • Foreach 你摆脱了所有索引问题,等等

【讨论】:

  • Foreach 不是线程安全的。 Foreach 不是类型安全的(它更不安全,因为它意味着强制转换)。
【解决方案2】:

既然您提到了大量迭代的性能问题 - 是的,foreach 可能比for 慢。您需要测量迭代的两个版本,并查看for 在您的特定情况下对于那个一个关键迭代 是否确实更快。如果您发现 for 更快(在某种程度上对您的程序很重要),您可以禁止该特定循环的 R# 警告。

注意foreach 不需要提前知道收集的长度。将传入的数据转换为某种流序列(即IEnumerable<T>Stream 或读取器类之一)并使用foreach 处理直到到达末尾而不是先加载整个序列并迭代可能是有益的结果。这对于大量数据(即解压缩可能不适合内存的大图像)更为重要。

【讨论】:

    【解决方案3】:
    1. 我相信这是因为与for 相比,foreach 更具声明性并且包含更少的混乱和簿记。同样正如@TimSchmelter 在 cmets 中所说,它更灵活,因为它不仅仅适用于可索引的集合。不过,这只是风格(和代码可读性/可维护性)的问题。

    2. 定义“安全”。只要您遍历可索引集合(数组、列表...),for 就可以完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 2019-06-09
      • 2011-07-03
      • 2021-04-12
      • 1970-01-01
      • 2012-05-31
      相关资源
      最近更新 更多