C#中IEnumerable类的foreach和for循环之间的区别

Cra*_*aig 13 c# performance loops

有人告诉我,以下代码块之间存在性能差异.

foreach (Entity e in entityList)
{
 ....
}
Run Code Online (Sandbox Code Playgroud)

for (int i=0; i<entityList.Count; i++)
{
   Entity e = (Entity)entityList[i];
   ...
}
Run Code Online (Sandbox Code Playgroud)

哪里

List<Entity> entityList;
Run Code Online (Sandbox Code Playgroud)

我不是CLR期望,但从我可以告诉他们应该归结为基本相同的代码.有没有人有这样或那样的混凝土(哎呀,我拿着装满污垢)的证据?

Dan*_*ngs 10

foreach创建一个枚举器的实例(从GetEnumerator返回),该枚举器在整个foreach循环过程中也保持状态.然后,它反复调用枚举器上的Next()对象,并为它返回的每个对象运行代码.

它们不会以任何方式归结为相同的代码,真的,如果您编写自己的枚举器,您会看到它们.


Dav*_*rab 9

是一篇很好的文章,显示了两个循环之间的IL差异.

Foreach在技术上较慢,但更容易使用和更容易阅读.除非性能至关重要,否则我更喜欢fore循环而不是for循环.


小智 6

foreach示例大致对应于此代码:

using(IEnumerator<Entity> e = entityList.GetEnumerator()) {
    while(e.MoveNext()) {
        Entity entity = e.Current;
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这里有两个成本,常规for循环不需要支付:

  1. 通过entityList.GetEnumerator()分配枚举器对象的成本.
  2. 两个虚方法的成本调用(MoveNext和Current)列表的每个元素.