2009-11-24 117 views
0

我有一个foreach环路像下面迭代时,foreach循环是否复制IEnumerable的每个项目?

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

当我在this.splits有单个元件,检查返回false。我通过其他方式检查,检查总是返回错误。任何想法为什么发生这种情况?

回答

5

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

此外,没有什么要求对象每次调用GetEnumerator时都返回相同的序列。在你的代码示例中,它在foreach中执行一次,而另一次调用.First。这些序列不需要等同。

+0

谢谢你。我很快检查了IEnumarable创建的地方,并且我发现这是我发现的 从rec in recs中选择新的XYZ(rec) 再次感谢您的帮助。 – malay 2009-11-24 09:09:39

相关问题