C#yield return使用相同的引用

时间:2014-11-28 10:38:55

标签: c# yield-return

我的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;每次参考?

2 个答案:

答案 0 :(得分:3)

如果您能够编译该代码而我们不能编译,则只有一种可能的解释:您有一个名为obj的字段,而本地变量obj会影响该字段。

如果是这样,返回字段 obj将解释为什么在每次迭代时获得相同的引用

答案 1 :(得分:2)

好吧,我对误导产量问题感到不爽,但这个问题是引用的问题。事实证明,真正的问题是MemberwiseClone,因为这只是一个浅层副本,因此所有深层成员引用都是相同的。

因此答案是Clone()方法应该执行深层复制。