3

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

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方法传递的原始实例,并且不在乎用于传递它的局部变量现在是否指向其他东西。任何人都可以确认这种理解或更清楚地解释它吗?

4

2 回答 2

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;
于 2012-06-28T17:44:34.087 回答
3

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

于 2012-06-28T17:43:55.103 回答