-5

这段代码的行为是什么?将是 s == “更改的实例”还是 s == “初始实例”?

SomeClass instance = new SomeClass();
instance.setName("initial instance")

List<SomeClass> list1 = new List<SomeClass>();
List<SomeClass> list2 = new List<SomeClass>();

list1.add(instance);
list2.add(instance);

list2.get(0).setName("changed instance");
string s = list1.get(0).getName();

编辑:好的,我对代码做了一些更改。我写得很快。EDIT2:为什么我问这个并且不尝试?因为由于某些限制,我在这台计算机上没有 IDE。

4

3 回答 3

5

对象通过引用传递。您有两个引用同一对象的列表。因此,更改一个列表中的对象会影响另一个列表中的对象。如果您要传递原语而不是对象,它将按值传递。当按值传递时,它本质上是一个副本。因此,更改一个列表中的值不会更改另一个列表中的值。

如果您希望一个类具有“类似值”的行为,您可以在该类中创建一个返回自身副本的方法。也就是说,包含成员和属性等的新对象设置为与原始对象相同的值。

例子:

public SomeClass Clone()
{
    SomeClass newSomeClass = new SomeClass();
    newSomeClass.setName(this.getName());
    return newSomeClass;
}

那么代码就变成了:

SomeClass instance = new SomeClass();
instance.setName("initial instance")

List<SomeClass> list1 = new List<SomeClass>();
List<SomeClass> list2 = new List<SomeClass>();

list1.add(instance);
list2.add(instance.Clone());

list2.get(0).setName("changed instance");
string s = list.get(0).getName();

结果将是 list1 和 list2 包含两个不同的 SomeClass 实例,具有不同的名称。

有关值与引用类型的更多信息,请参阅MSDN

于 2013-02-13T22:05:21.233 回答
3

当您将一个对象添加到两个列表中并更改一个列表中的对象时,另一个列表仍将引用同一对象,因此具有更新的值。

于 2013-02-13T22:04:12.697 回答
2

“更改的实例”,因为您只创建了一个实例,因此它们共享该实现。

于 2013-02-13T22:03:23.493 回答