我有类似的东西:
// Declarations:
List<SomeType> list1 = new List<SomeType>();
List<SomeType> list2 = new List<SomeType>();
...
SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);
...
list1[indexOfSomething] = new SomeType("SomeOtherName");
并且list2中的对象没有改变......这是预期的结果吗?
答案 0 :(得分:21)
是的,但没有任何克隆。在分配之前,两个列表中都有相同的对象。分配后,您在两个列表中有两个唯一对象。
执行此操作:
list1[indexOfSomething].name = "SomeOtherName";
,list2
中的对象也会改变。
答案 1 :(得分:7)
// Declarations:
List<SomeType> list1 = new List<SomeType>();
List<SomeType> list2 = new List<SomeType>();
...
SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);
请记住,当您将对象添加到列表时,您实际上只是添加了一个指向该对象的指针。在这种情况下,list1和list2都指向内存中的相同地址。
list1[indexOfSomething] = new SomeType("SomeOtherName");
现在您已将元素list1分配给不同的指针。
你自己并没有真正地克隆对象,你正在复制恰好指向同一个对象的指针。如果您需要证明,请执行以下操作:
SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);
list1[someIndex].SomeProperty = "Kitty";
bool areEqual = list1[someIndex].SomeProperty == list2[someIndex].SomeProperty;
areEqual
应该是真的。指针摇滚!
答案 2 :(得分:4)
你没有克隆对象;您正在添加对两个列表中的同一对象的引用。但是,您的代码使用对另一个对象的引用替换其中一个列表中的引用,所以是的,这是预期的行为。
答案 3 :(得分:4)
您将使用对新对象的引用替换一个列表中的引用。如果您改为更改该对象的属性,您会看到它在两个位置都发生了变化,因为引用将保持不变。
答案 4 :(得分:3)
是的,你没有克隆对象。该对象最初通过引用添加到两个列表中,然后您在列表中为您正在创建的新对象分配了一个引用。
这绝对是预期的结果。
答案 5 :(得分:1)
当你将'something'对象传递给Add时,你传递的是值(c#default),而不是通过引用传递
答案 6 :(得分:0)
是的,这是预期的。仅添加对象的引用。不是参考本身或副本。