【发布时间】:2021-09-29 03:41:12
【问题描述】:
根据以下链接,调用ToList()方法时会做一个shadow copy。
我已经测试了一些案例,但是我发现了一些奇怪的东西。
-
案例 - 自定义类 => 结果与上述结论相符。如果我更改了一个列表中对象的属性,而另一个也更改了。
-
大小写 - 字符串 => 结果与上述结论相矛盾。我已经更改了一个列表中的字符串,但另一个列表的值仍然与以前相同。
在我看来,Custom Class 和 String 都是对象,有什么区别呢? 任何人都可以建议吗?非常感谢!
var originalList1 = new List<Person> { new Person { Name = "Apple" }, new Person { Name = "Banana" } };
var copyList1 = originalList1.ToList();
originalList1[0].Name = "Orange";
Console.WriteLine(originalList1[0].Name); // Orange
Console.WriteLine(copyList1[0].Name); // Orange
var originalList2 = new List<string> { "Apple", "Banana" };
var copyList2 = originalList2.ToList();
originalList2[0] = "Orange";
Console.WriteLine(originalList2[0]); // Orange
Console.WriteLine(copyList2[0]); // Apple --- Why?
【问题讨论】:
-
提示:字符串是不可变的。如果不只是更改
originalList1[0].Name = ...,而是分配一个像originalList1[0] = ...这样的Person 对象,会发生什么? -
修改一个对象的一个实例,和用一个不同的对象实例的引用替换一个对象实例的引用是有区别的。您不能修改
string,因为它是不可变的,因此在这种情况下,您将替换引用,而不是修改对象本身,因此观察到的行为会有所不同。查看副本。 -
让我们将苹果与苹果进行比较,而不是香蕉或人:
originalList1[0] = new Person{ Name = "Orange"}- 现在它们的行为相同(都打印 Orange 然后 Apple) - 您的“为什么”的答案由此形成 -
抱歉这个愚蠢的问题。字符串是不可变的,这意味着我替换了一个新的而不是更改它的值。