是使用List <t> .Add复制对象,还是简单地“映射”?</t>

时间:2013-01-20 22:10:49

标签: c# collections

在C#中使用Lists时,我遇到了一些令人困惑的行为。如果我将给定类型的集合(我已经使用List<T>Array进行了测试)添加到List(即List<List<int>>),则修改子{ {1}}还将修改添加它的父List的内容。但是,如果我将一个不收集的对象(即Listbool)添加到int,修改对象本身将不会修改{的内容{1}}添加了它。我在下面提供了一些示例代码:

List

似乎在上面的示例中,List集合只是&#34;映射&#34;到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]。因此bigBoolboolList[0]的副本,它们是两个独立的对象。

所以我的问题是:为什么boolList[0]似乎有两个独立的功能,具体取决于添加到bigBool的类型?我已经检查过MSDN,但是我找不到这种行为。感谢。

2 个答案:

答案 0 :(得分:8)

这取决于对象的类型。

将复制值类型。使用引用类型时,将使用引用。

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

有关详细信息,请参阅MSDN上的Value Types and Reference Types

答案 1 :(得分:2)

将其视为平等,就像:

var added = myObject;

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

请参阅下面的完整MSDN参考: