C# 是否在for循环内的索引处存储数组元素

C# 是否在for循环内的索引处存储数组元素,c#,for-loop,refactoring,C#,For Loop,Refactoring,考虑C#中的两个for循环。其中一个比另一个有任何优点/缺点吗 一个没有将元素存储在索引i处 for(变量i=0;i

考虑C#中的两个for循环。其中一个比另一个有任何优点/缺点吗

一个没有将元素存储在索引i处

for(变量i=0;i
一个是将索引i处的元素存储在局部变量中

for(var i = 0; i < array.Length; i++) {
    var e = array[i];

    if(e.foo == 5) e.foo = e.bar + e.qux;

    // More usages of 'e'
}
<代码>for(var i=0;i<数组长度;i++){ var e=数组[i]; 如果(e.foo==5)e.foo=e.bar+e.qux; //“e”的更多用法 }

我正在使用的IDE将foreach循环转换为for循环,形式为后者,我想了解其背后的原因,如果有什么,那就是重构。没有速度提升,没有秘密技术被使用,只是重构。当您需要编辑代码时,它只会使您的工作更轻松,而不是写出数组[i]。这个和数组[i]。那个和数组[i]。您可以执行的其他操作e.this e.that e.otherstuff。打字更快,阅读更容易…

这只是重构。没有速度提升,没有秘密技术被使用,只是重构。当您需要编辑代码时,它只会使您的工作更轻松,而不是写出数组[i]。这个和数组[i]。那个和数组[i]。您可以执行的其他操作e.this e.that e.otherstuff。打字更快,阅读更容易…

如您所见,第二种做法更具可读性。它减少了代码重复,并且您不需要在每次计算中声明
array[i]

第二个问题是为什么IDE将每个循环的
转换为每个
循环的
,基本上每个
循环的
都将对象视为可枚举对象,这意味着它是其他对象的集合,它们实现了IEnumerator接口,IEnumerator对象在其自身称为迭代器模式中实现了一个设计模式,该模式允许您在集合中进行迭代并获取集合的下一个值。

长话短说
For循环在数组中具有更好的性能,因为它们在检索下一个值时使用的计算更少,但通常情况下,您不必担心这一点

如您所见,第二种做法更具可读性。它减少了代码重复,并且您不需要在每次计算中声明
array[i]

第二个问题是为什么IDE将每个循环的
转换为每个
循环的
,基本上每个
循环的
都将对象视为可枚举对象,这意味着它是其他对象的集合,它们实现了IEnumerator接口,IEnumerator对象在其自身称为迭代器模式中实现了一个设计模式,该模式允许您在集合中进行迭代并获取集合的下一个值。


长故事短
For
循环在数组中具有更好的性能,因为它们使用较少的计算来检索下一个值,但通常这不是您应该担心的

这样做的原因是为了最小化对循环中代码所需的更改。array[i].foo的操作比e.foo更长,因为array[i]有很多手术inside@juharr因此,唯一的原因是为了保护用户对可读性和代码熟悉度的偏好?@SarperS更可能是因为,如果它进行尽可能少的更改,则更容易和更安全。在多线程场景中,这将产生巨大的差异。如果您使用一个单独的方法进行计算,该方法将数组元素作为参数,并让它在每个元素的单独线程中运行,这将导致非常不同的结果。由于闭包,第一个版本将导致
IndexOutOfRangeException
,但第二个版本将很好地工作,因为它这样做是为了最小化对循环中代码所需的更改。array[i]。foo比e.foo更长的操作,因为array[i]有很多手术inside@juharr因此,唯一的原因是为了保护用户对可读性和代码熟悉度的偏好?@SarperS更可能是因为,如果它进行尽可能少的更改,则更容易和更安全。在多线程场景中,这将产生巨大的差异。如果您使用一个单独的方法进行计算,该方法将数组元素作为参数,并让它在每个元素的单独线程中运行,这将导致非常不同的结果。由于闭包的原因,第一个版本会导致一个
索引自动失效异常
,但是第二个版本会很好地工作,因为它们不一样。在第一个版本中,必须反复访问数组,而在第二个版本中只使用一次。请在同一个版本上执行ctrl+f,然后查看我提到的位置it@CamiloTerevinto,当然这只是一种感觉——实际上,编译器会将两个版本优化为相同的代码?我也这么说,因为它只是从数组[i]更改而来打电话给e。。。没有你说的那么疯狂,巴德。。简单重构它们不一样。在第一个版本中,必须反复访问数组,而在第二个版本中只使用一次。请在同一个版本上执行ctrl+f,然后查看我提到的位置it@CamiloTerevinto,当然这只是一种感觉——实际上,编译器会将两个版本优化为相同的代码?我也这么说,因为它只是从数组[i]更改而来打电话给e。。。没有你说的那么疯狂,巴德。。简单的重构解释了为什么ide会不断转换,而且它也是一个更干净的答案。。。只是为了澄清,IDE并没有将foreach循环转换为for循环,相反,它建议我在适用的地方使用foreach循环。如果我让它转换,它只喜欢后一种形式。感谢您的回答。值得注意的是,对于所有类型的集合,
foreach
循环不会变慢。对于数组来说,数值
for
循环当然更快,但对于列表来说,则不然,因为在列表中,按索引进行的查找不一定是固定时间。@M
for(var i = 0; i < array.Length; i++) {
    var e = array[i];

    if(e.foo == 5) e.foo = e.bar + e.qux;

    // More usages of 'e'
}