3

Lists在 C# 中使用时,我遇到了一些令人困惑的行为。如果我将一个给定类型的集合(我已经用List<T>和测试过Array)添加到一个List(即List<List<int>>),修改子也将修改它被添加到List的父的内容。List但是,如果我将一个不是集合的对象(即 abool或 an int)添加到 a List,则修改对象本身不会修改List它添加到的内容。我在下面包含了一些示例代码:

List<List<int>> intList = new List<List<int>>();
List<int> ints = new List<int>();

ints.Add(12345);
intList.Add(ints);
Console.WriteLine(intList[0].Count); //intList[0].Count is 1

ints.Clear();
Console.WriteLine(intList[0].Count); //intList[0].Count is 0

似乎在上面的例子中,ints集合只是简单地“映射”到intList[0],所以当你修改ints集合本身时,你也在修改intList[0],因为它们是同一个对象。这与下一个示例形成对比:

List<bool> boolList = new List<bool>();
bool bigBool = false;

boolList.Add(bigBool);
Console.WriteLine(boolList[0]); //boolList[0] is false

bigBool = true;
Console.WriteLine(boolList[0]); //boolList[0] is...still false??

在上面的示例中,似乎不是被映射到boolList[0],而是被bigBool复制到boolList[0]boolList[0]的副本也是如此bigBool,它们是两个独立的对象。

所以我的问题是:为什么似乎有两个独立的功能List<T>.Add,这取决于添加到的类型是什么List?我检查了 MSDN,但我找不到任何关于这种行为的提及。谢谢。

4

2 回答 2

8

这取决于对象的种类。

值类型将被复制。对于引用类型,将使用引用。

整数、布尔值DateTime是值类型,例如(结构是值类型)和stringList<T>是引用类型(类是引用类型)。

有关详细信息,请参阅MSDN 上的值类型和引用类型

于 2013-01-20T22:13:29.317 回答
2

把它想象成平等,就像:

var added = myObject;

如果对象是值类型(比如数字等),或者是不可变的,比如string,那么它会被复制。如果它是一个非不可变的引用类型,就像几乎所有的类实例一样,那么它只会获得对同一个对象实例的另一个引用。

有关详细的 MSDN 参考,请参见下文:

于 2013-01-20T22:15:06.613 回答