我有一个成员变量,它是一个引用类型列表。在我创建和项目的方法中,将其添加到列表中。然后该项目更新指向另一个实例,但列表中的实例不会更新(他在某些单元测试代码中)。示例如
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
方法传递,并且不关心用于传递它的局部变量现在指向其他东西。任何人都可以证实这种理解或更清楚地解释它吗?
答案 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
上的任何属性,这些属性将在您通过列表访问项目时反映出来。