使用相同的引用的 C# 收益回报

本文关键字:收益 回报 引用 | 更新日期: 2023-09-27 18:32:17

我在 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",但在第二次迭代中它包含两次"对象 2"。显然,问题在于变量 'obj' 是通过引用传递的,即使它是在 foreach 循环中声明的,也不会被创建新的。

所以我的问题是我每次如何创建新的"obj"引用?

使用相同的引用的 C# 收益回报

如果你能够编译该代码而我们却不能,那么只有一个可能的解释:你有一个名为 obj 的字段,并且局部变量obj遮蔽了该字段。

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

好吧,我对产量问题的误导感到很糟糕,但问题是参考问题。事实证明,真正的问题是 MemberwiseClone,因为这只是一个浅拷贝,所以所有深层成员引用都是相同的。

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