在IEnumerable<string>()
中,通过ToList()
获得副本后,如果修改副本的项目,字符串是否会被更改?答案是否定的,这很容易测试。
IEnumerable<string> sample = new List<string>() { "1", "2", "3"};
var list = sample.ToList();
foreach(var item in sample)
{
if (item == "2")
{
var idx = list.IndexOf(item);
list[idx] = "1";
}
}
foreach(var item in sample)
{
Console.WriteLine($"item value: {item}");
}
因此,当字符串在浅表副本的集合内运行时,字符串是值类型而不是引用类型。但是字符串实际上是引用类型。
那么,什么决定字符串表现为值类型呢?应该用“不变”的概念来解释吗?但是,如果您实际上使用了诸如IEnumerable之类的实际引用类型来收集myCustomObject
类型的myCustomObject.string
类型的集合,那么即使您执行sample.ToList()
并且修改copy.string
。