C#在更多地方的单个实例

本文关键字:单个 实例 | 更新日期: 2023-09-27 17:58:56

此代码的行为是什么?将是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();

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

C#在更多地方的单个实例

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

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

示例:

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。

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

"Changed instance",因为您只创建了一个实例,所以它们共享该实现。