我的C#中的迭代器出了问题,我似乎无法解决。以下是两个相关的方法(为了问题的目的而简化):
protected virtual IEnumerable<T> Iterator()
{
// Code here omitted for brevity
foreach(object row in compiler.ResultsIterator())
{
Model obj;
object[] row_array = new object[fields_length];
// Logic to set row_array values omitted for brevity
obj = _model.Clone(); // Does a MemberwiseClone
obj.SetFieldValues(row_array);
yield return (T)(obj as object);
}
}
private void FillCache()
{
IEnumerator<T> _iter = Iterator().GetEnumerator();
while(_iter.MoveNext())
{
ResultCache.Add(_iter.Current);
}
}
问题是在FillCache()的第一次迭代中,ResultCache包含一个对象,让我们称之为对象1&#39;但是在第二次迭代中,它包含了对象2&#39;两次。显然问题是变量&#39; obj&#39;通过引用传递,即使它在foreach循环中声明,也不会被创建为新的。
所以我的问题是我如何创建一个新的对象&#39;每次参考?
答案 0 :(得分:3)
如果您能够编译该代码而我们不能编译,则只有一种可能的解释:您有一个名为obj
的字段,而本地变量obj
会影响该字段。
如果是这样,返回字段 obj
将解释为什么在每次迭代时获得相同的引用
答案 1 :(得分:2)
好吧,我对误导产量问题感到不爽,但这个问题是引用的问题。事实证明,真正的问题是MemberwiseClone,因为这只是一个浅层副本,因此所有深层成员引用都是相同的。
因此答案是Clone()方法应该执行深层复制。