为什么自动实现的列表 属性 充当 C# 中所有实例的共享 属性?

Why auto-implemented list property act as a shared property for all instances in C#?

我已经实现了以下代码,当我想从其中一个实例的 ColumnsList 更新(添加或删除)时,它会影响所有其他实例。

    public class XMLAttributeStructure
    {
        public string TableName { get; set; }
        public int Row { get; set; }
        public List<string> ColumnsList { get; set; }
        public string Attribute { get; set; }
        public string Value { get; set; }

        public XMLAttributeStructure(string tablename, int row, List<string> columnlist, string attribute, string value)
        {
            TableName = tablename;
            Row = row;
            ColumnsList = columnlist;
            Attribute = attribute;
            Value = value;
        }
    }

输出:

例如,我认为我已经有 2 个包含“No”、“Status”的 columnsList 对象。并认为我使用以下方法从第一个实例的 columnList 中删除了“ST”。

selectedObj.ColumnsList.Remove("ST");

selectedObj 是第一个实例。但是第二个对象中的“ST”也被删除了。

不管任何其他问题,最简单的解决方案就是重新分配您的列表

public XMLAttributeStructure(string tablename, int row, List<string> columnlist, string attribute, string value)
{
    ...
    ColumnsList = columnlist.ToList();

另一种解决方案是在调用构造函数时执行此操作。这样构造函数就不会做任何意想不到的事情,它让调用者选择他们是否希望 class 有一个新的实例

XMLAttributes.Add(
   new XMLAttributeStructure(
       tableName, 
       i, 
       colList.ToList(),
       attribute, 
       value));

长话短说,当您复制引用类型时,您并不是在复制实际对象(克隆),而是在复制对该对象的引用


其他资源