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