C# 是否使用列表复制对象<;T>;。加上,或简单地说;映射;?

C# 是否使用列表复制对象<;T>;。加上,或简单地说;映射;?,c#,collections,C#,Collections,在C#中使用列表时,我遇到了一些令人困惑的行为。如果我将给定类型的集合(我已经用列表和数组进行了测试)添加到列表(即列表),修改子列表也会修改它添加到的父列表的内容。但是,如果我将非集合的对象(即bool或int)添加到列表,则修改对象本身不会修改其添加到的列表的内容。我在下面提供了一些示例代码: List<List<int>> intList = new List<List<int>>(); List<int> ints = new

在C#中使用
列表时,我遇到了一些令人困惑的行为。如果我将给定类型的集合(我已经用
列表
数组
进行了测试)添加到
列表
(即
列表
),修改子
列表
也会修改它添加到的父
列表
的内容。但是,如果我将非集合的对象(即
bool
int
)添加到
列表
,则修改对象本身不会修改其添加到的
列表
的内容。我在下面提供了一些示例代码:

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
在上面的示例中,
bigBool
似乎没有被映射到
boolList[0]
,而是被复制到
boolList[0]
。所以
boolList[0]
bigBool
的副本,它们是两个独立的对象


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

这取决于对象的类型

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

整数、布尔、
DateTime
是值类型,例如(结构是值类型)和
string
List
是引用类型(类是引用类型)


有关详细信息,请参见MSDN上的内容。

像平等一样思考它,就像:

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

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


谢谢,这回答了我的问题!我不知道有不同种类的类型…这似乎有点混乱,但很高兴知道。我还要指出,
string
(除了它是引用类型之外)也是不可变类型。因此,如果在OP的第二个示例中使用了
string
,则列表中的值也不会更改。@mipe34-变量不是不可变的。这根绳子是。
var added = myObject;