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

本文关键字:列表 新列表 一个 另一个 设置 指针 实际上 创建 | 更新日期: 2023-09-27 18:30:15

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

例如

是。。。

List<SomeType> newList = oldList;

。同...

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

(旧列表也是某个类型的列表)?

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

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

另一方面,值类型(结构)在分配时被复制。

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

在赋值中,例如:

List<SomeType> newList = oldList;

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

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

将是 2 个独立的独立列表(都在内存中)。一个列表中的更改不会影响另一个列表。

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

要使列表复制和产品,您需要克隆产品,这可能会很棘手,因为克隆是递归的,具体取决于类型的复杂性。