7

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

例如,

是...

List<SomeType> newList = oldList;

……和……一样

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

(oldList 也是 SomeType 的列表)?

4

3 回答 3

10

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

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

于 2013-09-05T18:52:12.613 回答
5

赋值运算符不是克隆运算符。在引用类型的情况下,它复制引用的值。

于 2013-09-05T18:49:53.430 回答
3

在分配中,例如:

List<SomeType> newList = oldList;

两个列表将完全相同,在列表中添加或删除一个项目将使其在另一个列表中发生变化。除了额外的指针外,它们都使用相同的内存空间。

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

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

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

要复制列表和产品,您需要克隆产品,因为克隆是递归的,具体取决于类型的复杂性。

于 2013-09-05T18:59:04.200 回答