添加到List后修改项目不更新列表

时间:2012-06-28 17:41:33

标签: c#

我有一个成员变量,它是一个引用类型列表。在我创建和项目的方法中,将其添加到列表中。然后该项目更新指向另一个实例,但列表中的实例不会更新(他在某些单元测试代码中)。示例如

Item localItem = new Item(arg1, arg2);
this.itemList.Add(localItem);

// Do some testing and assertions

localItem = new Item(arg3, arg4);  // This does not update the instance of
                                   // localItem in this.ItemList

// Do some more testing and assertions

我可以更新我的测试来解决这个问题,但它仍然让我感到意外。我想让List希望保持原始实例通过Add方法传递,并且不关心用于传递它的局部变量现在指向其他东西。任何人都可以证实这种理解或更清楚地解释它吗?

2 个答案:

答案 0 :(得分:6)

当然没有。 localItem是对实际对象(不是对象本身)的引用。该列表还包含对此同一对象的引用。如果您将另一个项目分配给localItem,它现在指向另一个对象,但该列表仍然引用了旧对象。

如果您希望列表中的对象自动更新,您必须引入一个新对象,该对象包含对该项的引用并将此对象添加到列表中

public class ItemReference
{
    public Item Item { get; set; }
}

现在您可以创建像这样的本地项目

ItemReference itemRef = new ItemReference();
itemRef.Item = new Item(arg1, arg2);

this.itemReferenceList.Add(itemRef);
itemRef.Item = new Item(arg3, arg4);

因为列表现在引用了相同的(未更改的)itemRef,所以它“看到”了新项目。

列表必须声明为

List<ItemReference> itemReferenceList;

答案 1 :(得分:3)

localItem添加到列表中时,您将引用添加到对象实例(假设Item是引用类型,即class) - 当您随后创建一个新的Item实例,结果是新引用(类似于指针) - 如果要更新列表,则必须删除旧项并添加新项 - 这是两个完全不同的例子。或者,您可以修改localItem上的任何属性,这些属性将在您通过列表访问项目时反映出来。