C#单个实例在更多地方

Joh*_*ohn -5 c# arrays oop

这段代码的行为是什么?将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();
Run Code Online (Sandbox Code Playgroud)

编辑:好的,我对代码做了一些更改.我写得很快.编辑2:为什么我问这个,不试试?因为有一些限制我在这台电脑上没有IDE.

spa*_*967 5

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

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

例:

public SomeClass Clone()
{
    SomeClass newSomeClass = new SomeClass();
    newSomeClass.setName(this.getName());
    return newSomeClass;
}
Run Code Online (Sandbox Code Playgroud)

然后代码变成:

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();
Run Code Online (Sandbox Code Playgroud)

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

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