在C#中,当我将一个新列表设置为另一个列表时,它是将新列表设置为指向另一个列表的指针,还是实际创建了一个新列表?

在C#中,当我将一个新列表设置为另一个列表时,它是将新列表设置为指向另一个列表的指针,还是实际创建了一个新列表?,c#,list,object,pointers,C#,List,Object,Pointers,当我将一个新列表设置为另一个列表时,它是将新列表设置为指向另一个列表的指针,还是实际创建了一个新列表 比如说, 是 List newList=oldList; ……与 List<SomeType> newList = new List<SomeType>(); newList.AddRange(oldList); List newList=newList(); newList.AddRange(旧列表); (oldList也是某种类型的列表)赋值运算符不是克隆运算符

当我将一个新列表设置为另一个列表时,它是将新列表设置为指向另一个列表的指针,还是实际创建了一个新列表

比如说,

List newList=oldList;
……与

List<SomeType> newList = new List<SomeType>();
newList.AddRange(oldList);
List newList=newList();
newList.AddRange(旧列表);

(oldList也是某种类型的列表)

赋值运算符不是克隆运算符。对于引用类型,它复制引用的值。

将有一个
列表和多个引用。这适用于所有引用类型(类)

另一方面,赋值时会复制值类型(结构)。

在赋值中,例如:

List<SomeType> newList = oldList;
List newList=oldList;
两个列表将完全相同,添加或删除列表中的一个项目将使另一个列表中的项目发生更改。它们都在一个额外指针旁边使用相同的内存空间

List<SomeType> newList = new List<SomeType>();
newList.AddRange(oldList);
List newList=newList();
newList.AddRange(旧列表);
将是2个独立列表(都在内存中)。一个列表中的更改不会影响另一个列表

记住,如果你的“某物类型”是复杂类型。。。让我们说一个“产品”。在这两种情况下,所有列表都将引用您的产品,因此一个产品中的更改将在另一个列表中更改


要复制列表并复制产品,您需要克隆产品,这可能是个骗局,因为克隆是递归的,具体取决于类型的复杂性。

此外,通过实验很容易找到它……是的,但是我在哪里可以找到所有以这种方式运行的数据类型的列表?我想这才是我更感兴趣的…几乎所有C#(或大多数语言)的作业都很肤浅。你问的是一份深度副本。默认情况下,这样做会让事情变得非常缓慢,并导致一些非常意外的行为。(编辑:是的,C++中有一个好的OL’拷贝构造器,并且复制值的参数传递,但是我们不复杂化)。这个主题的先例回答“Alxand Ruu所有引用类型都是这样做的。赋值操作符复制所有的值类型(以及它们各自的值,递归地,但是值类型中包含的引用被复制,而不是被引用的obejct)。Theodoros,我在哪里可以找到C#中所有内置引用类型的列表?编辑:也许,最好是从C语言中找到所有值类型的列表,因为它较小,并且考虑所有其他类型的引用类型。那么,@ Alxand Ruu以编程方式确定它,有<代码>类型。要在编写代码时确定它,请在IDE中查找提示(例如,据我记忆所及,VS对结构有不同的IntelliSense图标)。如果由于任何原因这是不可能的,那么检查一下你当时正在使用的库的文档。回答得很好,伙计。感谢您尊重这个问题并深入讨论这个问题。
List<SomeType> newList = new List<SomeType>();
newList.AddRange(oldList);