为什么Resharper推荐foreach而不是Loop?

时间:2013-11-25 17:00:18

标签: c# loops collections foreach resharper

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集合的性能,这些集合可以用整数索引。

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

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

1。为什么Resharper推荐foreach而不是Loop?
2.用于循环是否安全?

3 个答案:

答案 0 :(得分:2)

  • 表现更快!
  • Foreach它可以用作强类型集合 以简单的方式!
  • Foreach你摆脱了所有指数问题等

答案 1 :(得分:2)

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

请注意,foreach不需要提前知道收集的长度。将您的传入数据转换为某种流式序列(即IEnumerable<T>Stream或其中一个读者类)可能会有所帮助,并使用foreach进行处理,直到您到达终点而不是加载首先是整个序列,然后迭代结果。这对于大量数据(即解压缩可能不适合存储器的大图像)更为重要。

答案 2 :(得分:1)

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

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