在C#中使用Lists
时,我遇到了一些令人困惑的行为。如果我将给定类型的集合(我已经使用List<T>
和Array
进行了测试)添加到List
(即List<List<int>>
),则修改子{ {1}}还将修改添加它的父List
的内容。但是,如果我将一个不收集的对象(即List
或bool
)添加到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]
。因此bigBool
是boolList[0]
的副本,它们是两个独立的对象。
所以我的问题是:为什么boolList[0]
似乎有两个独立的功能,具体取决于添加到bigBool
的类型?我已经检查过MSDN,但是我找不到这种行为。感谢。
答案 0 :(得分:8)
这取决于对象的类型。
将复制值类型。使用引用类型时,将使用引用。
整数,布尔值,DateTime
是值类型,例如(结构是值类型)和string
,List<T>
是引用类型(类是引用类型)。
有关详细信息,请参阅MSDN上的Value Types and Reference Types。
答案 1 :(得分:2)
将其视为平等,就像:
var added = myObject;
如果对象是值类型(如数字等),或者是不可变的,如string
,则将其复制。如果它是一个非不可变的引用类型,就像几乎所有类实例一样,那么它只是获得对同一对象实例的另一个引用。
请参阅下面的完整MSDN参考: