为什么要避免使用foreach迭代不可变的值类型集合?

dri*_*iis 11 .net c#

在编码标准文件中,我发现了这样的声明:

避免使用foreach迭代不可变的值类型集合.例如字符串数组.

为什么要避免这种情况?

Jon*_*eet 18

你不应该避免它.你正在阅读的编码标准文件正在胡说八道.试着找到作者并请他解释.

除了其他任何东西,它string是一个引用类型,数组总是可变的...这让我关心文档其余部分的质量,说实话.还有其他可疑的建议吗?

(有可能"不可变"意味着指代价值类型而不是集合 - 这是另一个令人担忧的标志,即IMO.这一事实是模棱两可的.)

  • 一个编码标准文件说废话?*停止按下* (6认同)
  • 不仅如此,唯一的好价值类型是不可变值类型! (3认同)

Guf*_*ffa 8

我认为该声明的原因是它是在.NET 2.0之前编写的.

在.NET 1.x中使用foreach时,它正在使用IEnumerable接口(因为IEnumerable<T>接口尚不存在.)当迭代值类型集合时,枚举器会将每个项目都装箱,以便能够将其作为对象引用返回,那么foreach代码必须将其拆箱.

字符串数组当然不是值类型数组的示例.整数数组是.


Bri*_*sen 6

我同意Jon的意见,这个建议没什么意义.我的猜测是作者发现在迭代时你不能改变当前项的值.但是,如果您正在迭代一组引用类型,您仍然可以修改当前项指向的对象.也许(s)他得出结论,迭代在某种程度上被破坏了价值类型集合.