关于c#:为什么Resharper推荐foreach而不是for Loop?

Why does Resharper Recommend foreach Instead of for Loop?

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

Do You Use foreach?

Using foreach can result in extra overhead because of the way
enumeration is implemented in .NET Framework collections. .NET
Framework 1.1 collections provide an enumerator for the foreach
statement to use by overriding the IEnumerable.GetEnumerator.
...
Consider using a for loop instead of foreach to increase performance for iterating through .NET Framework collections that can be indexed with an integer.

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

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

1。为什么Resharper建议foreach而不是for loop?2。循环使用安全吗?


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

注意,foreach不要求提前知道收款的长度。将您输入的数据转换成某种流序列(即IEnumerableStream或其中一个读卡器类)并使用foreach进行处理,直到到达末尾,而不是先加载整个序列并迭代结果,这可能会很有好处。这对于大量数据(即解压缩可能不适合内存的大图像)更为重要。


  • 性能更快!
  • foreach它可以用作强类型集合以简单的方式!
  • 每一个你都能解决所有的索引问题等。


  • 我认为这是因为与for相比,foreach更具声明性,包含的混乱和簿记更少。正如@timschmelter在评论中所说的,它的灵活性更高,因为它不仅可以处理可索引的集合。不过,这只是风格(以及代码可读性/可维护性)的问题。

  • 定义"安全"。只要在可索引集合(array,list…)中迭代,for就完成了任务。