在 C# 中生成列表的新实例

Dan*_*uez 0 c# clone reference list

我有一个问题,使用C#,如果我初始化一定名单,可以说List<T> exampleList使用其他预先存在的列表,可以说toModify这样的:List<T> exampleList = new List<T>(toModify)。当我稍后修改toModify列表时,新创建的列表也会修改自身。如果通过由基准的值不应该的值exampleList保持不变,因为它是从其他的一个产生的?

TLDR:当我更改第二个列表时,我使用另一个列表(第二个列表)初始化的列表的值会发生变化。我来自 Java 背景,无法理解为什么会发生这种情况。我总是必须使用克隆吗?

Fab*_*jan 5

让我们用这个例子:

        List<A> firstList = new List<A>()
        {
            new A() { Id = 3 },
            new A() { Id = 5 }
        };

        List<A> secondList = new List<A>(firstList);

        secondList[1].Id = 999;

        Console.WriteLine(firstList[1].Id);
Run Code Online (Sandbox Code Playgroud)

输出:999

这样做的主要原因是,即使我们创建了一个List<T>指向在堆上分配的新内存的 new ,它仍然可以使用指向相同对象的引用。

要创建一个指向具有相同值的新(!)对象的列表,我们需要以某种方式克隆这些元素,一种方法是使用 LINQ.Select()方法来创建新对象,然后使用一种ToList()方法来复制列表本身:

        List<A> firstList = new List<A>()
        {
            new A() { Id = 3 },
            new A() { Id = 5 }
        };

        List<A> secondList = firstList.Select(el => new A() { Id = el.Id }).ToList();

        secondList[1].Id = 999;

        Console.WriteLine(firstList[1].Id);
Run Code Online (Sandbox Code Playgroud)

输出:5