在C#中,使用foreach和for循环遍历IEnumerable类的区别

32 浏览
0 Comments

在C#中,使用foreach和for循环遍历IEnumerable类的区别

有人告诉我这两个代码块之间存在性能差异。

foreach (Entity e in entityList)
{
 ....
}

for (int i=0; i

其中

List entityList;

我不是CLR专家,但从我所了解的来看,它们应该归结为基本相同的代码。有人能提供确凿的(哪怕是压缩的土壤)证据吗?

0
0 Comments

在C#中,使用foreach循环和for循环遍历IEnumerable类的区别是什么?

这个问题的出现原因是foreach循环在实现上相当于使用IEnumerator接口进行遍历,而for循环则直接通过索引进行遍历。具体来说,foreach循环大致对应以下代码:

using(IEnumerator e = entityList.GetEnumerator()) {
    while(e.MoveNext()) {
        Entity entity = e.Current;
        ...
    }
}

这里有两个开销是常规for循环不需要支付的:

1. 通过entityList.GetEnumerator()来分配枚举器对象的开销。

2. 每个列表元素需要进行两次虚方法调用(MoveNext和Current)的开销。

解决这个问题的方法是使用for循环来代替foreach循环。通过使用索引直接访问列表的元素,可以避免分配枚举器对象和虚方法调用的开销。

以下是使用for循环遍历IEnumerable类的示例代码:

for(int i = 0; i < entityList.Count(); i++) {
    Entity entity = entityList.ElementAt(i);
    ...
}

通过这种方式,我们可以避免foreach循环的额外开销,从而提高代码的执行效率。

0
0 Comments

在C#中,对于一个实现了IEnumerable接口的类,我们可以使用foreach循环和for循环来遍历其元素。然而,这两种循环的实现方式有所不同。

首先,foreach循环会创建一个枚举器(通过GetEnumerator方法返回),并且在整个foreach循环的过程中,该枚举器会保持状态。然后,它会重复调用枚举器的Next()方法,并且对每个返回的对象运行相应的代码。

与此相反,for循环需要手动管理循环的索引,通过索引来访问集合中的每个元素。它不会创建枚举器对象,也不会保持状态。

实际上,这两种循环的底层代码并不相同,如果你自己编写一个枚举器,就会发现它们并不等价。

所以,为什么会有这样的差异呢?差异的原因在于foreach循环的设计初衷是为了让开发人员更加方便地遍历集合,而不需要手动管理索引。通过使用枚举器,foreach循环可以自动处理集合的迭代过程,并且保持循环的状态。

那么如何解决这个问题呢?解决方法很简单,如果你需要手动管理索引并且需要更多的控制权,那么使用for循环是一个不错的选择。但是,如果你只是简单地遍历集合并对每个元素运行相应的代码,那么使用foreach循环会更加方便和简洁。

总结起来,foreach循环和for循环在对实现了IEnumerable接口的类进行遍历时有所不同。foreach循环会创建枚举器对象,并保持循环的状态,而for循环需要手动管理索引。选择使用哪种循环取决于你的具体需求,使用foreach循环可以让你更加方便地遍历集合,而使用for循环可以给你更多的控制权。

0
0 Comments

在C#中,有两种常用的循环方式:foreach和for循环。尽管它们都可以用于遍历实现IEnumerable接口的类,但它们在实现方式和性能方面存在一些差异。

一篇文章(Here)展示了这两种循环的IL(Intermediate Language)差异。从技术上讲,foreach循环速度较慢,但使用起来更加简单易读。除非性能非常关键,否则我更喜欢使用foreach循环而不是for循环。

然而,有一些情况下可能会选择for循环。例如,dnspy调试器是一种无需源代码即可调试远程服务器上的.NET应用程序的工具。但是,当前版本的dnspy调试器无法通过按F11键进入foreach循环(然而,VS2017调试器可以)。对于这种情况,如果foreach循环也更慢的话,可能会成为一个无法忍受的问题。

此外,在一些语言(如Javascript)中,foreach循环有两种变体(例如数组和for...in循环)。后一种变体的行为并不总是那么直观,这可能会显著降低foreach循环的“易于使用和易于阅读”的优势。

选择使用foreach循环还是for循环取决于具体的需求和情况。如果性能不是关键因素,并且更注重代码的可读性和简洁性,那么foreach循环是一个更好的选择。但是,在需要与特定调试器或在使用其他语言时,可能需要考虑使用for循环。

0