使用相同的引用的 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"引用?
如果你能够编译该代码而我们却不能,那么只有一个可能的解释:你有一个名为 obj
的字段,并且局部变量obj
遮蔽了该字段。
如果是这样,返回字段obj
将解释为什么您在每次迭代时都会获得相同的引用
好吧,我对产量问题的误导感到很糟糕,但问题是参考问题。事实证明,真正的问题是 MemberwiseClone,因为这只是一个浅拷贝,所以所有深层成员引用都是相同的。
因此,答案是 Clone() 方法应该执行深层复制。