[英]Modifying item after addition to List does not update list
我有一个成员变量,它是一个引用类型列表。 在我创建和项目的方法中,将其添加到列表中。 然后该项目更新指向另一个实例,但列表中的实例不会更新(他在某些单元测试代码中)。 示例看起来像
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
方法传递,并且如果现在用于传递它的局部变量指向其他东西则不在乎。 任何人都可以证实这种理解或更清楚地解释它吗?
当然不是。 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
的引用, itemRef
它也“看到”新项目。
该列表必须声明为
List<ItemReference> itemReferenceList;
将localItem
添加到列表时,添加对对象实例的引用 (假设Item
是引用类型,也就是class
) - 当您随后创建新的Item
实例时,结果是新引用 (类似于指针) - 如果您想要更新列表,你必须删除旧项目并添加新项目 - 这是两个完全不同的实例。 或者,您可以修改localItem
上的任何属性,这些属性将在您通过列表访问项目时反映出来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.