foreach循环是否会在迭代时复制IEnumerable的每个项目?

时间:2009-11-24 08:57:40

标签: c# foreach ienumerable

我有一个foreach循环,如下所示

        foreach (XYZ split in this.splits )
        {
            // this code is inserted for debug purpose only
            bool check = object.ReferenceEquals(splits.First(), split);
            .....
        }

当我在this.splits中有单个元素时,检查返回false。我通过其他方式检查,检查总是返回false。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:5)

取决于枚举器的实现方式。实现可以自由返回副本或对象本身。事实上,它可以回报任何它喜欢的东西;例如,Enumerable.Range返回一个数字序列,并且没有任何元素实际存储在任何地方。它们是在运行中生成的。如果返回类型是值类型,它肯定是某种东西的副本。

此外,每次调用GetEnumerator时,都不需要对象返回相同的序列。在您的代码示例中,它会在foreach中执行一次,而在您调用.First时则会执行一次。这些序列不需要是等效的。