静态列表引用是在将其复制到其他列表时创建的。如何避免?

static list ref is created on copy of it to other list. how to avoid?

我知道有人问了这个问题并且已经在这里回答了: C# how to assign List<T> without being a reference?

但正如@Dev 所说,它仍在被引用。我的“name_list1”是静态的,然后我正在应对:

name_list2 = new List<string>(name_list1);

如上文所述link。我已经尝试了从 Whosebug 建立的所有可能的解决方案,例如: 使用 - AddRangeToListToArray 等等。但它仍然只为 name_list1 创建 ref。当我在 name_list2 中更改对象值时,它也在 name_list1 中受到影响。

我需要再次问这个问题,因为我无法对其他问题发表评论,因为 <50 声望:P :(

您需要遍历第一个列表,克隆所有对象,然后将它们添加到 list2。

否则,即使列表对象不同,它们引用的项目仍然相同,因此对列表项目所做的任何更改都将反映在其他列表中。

请参阅此 SO 答案了解如何克隆。 Deep cloning objects.

此外,需要理解的一个概念是,当您创建另一个列表并使用 AddRange 时,两个列表对象是不同的。
对一个列表的更改不会反映在其他列表中。这些更改包括添加列表项、删除列表项、排序列表项。
这些集合级别的更改不同于单个列表项的更改,反映为单个列表项在两个列表中仍然相同(除非它们在添加到列表之前被克隆)。

为了简单地解决这个问题,我手动添加了对象项的每个值。因为我还尝试遍历每个对象以将其添加到列表中,但这是行不通的。所以对我来说简单的解决方案是编写列表项对象的构造函数,它有一个参数接受自身的对象类型并手动添加所有值。我会在一段时间内做更多的事情来以更好的方式解决这个问题。感谢大家的帮助:)

而且我们还可以使用:

public static T DeepCopy<T>(T item)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream stream = new MemoryStream();
            formatter.Serialize(stream, item);
            stream.Seek(0, SeekOrigin.Begin);
            T result = (T)formatter.Deserialize(stream);
            stream.Close();
            return result;
        }