C#中自动实现的List属性为何会表现为所有实例的共享属性?
问题根因
你遇到的修改单个实例属性就同步影响所有其他实例的现象,本质是C#引用类型的传递规则导致的:
List<string>属于引用类型,对这类类型的变量做赋值操作时,传递的不是List本身的元素内容,而是List在内存中的存放地址。- 你当前的构造函数是直接把传入的
columnlist参数值赋值给ColumnsList属性,没有做独立副本拆分。如果你创建多个实例时,给每个实例传入的是同一个源List对象(比如提前定义了一个公共List存放"No"、"Status"、"ST"这些列名,再把这个公共List分别传给两个实例的构造函数),那么这几个实例的ColumnsList属性实际上全部指向了内存中同一个List实体。 - 你对任意一个实例执行
ColumnsList.Remove("ST")操作,修改的是这块公共内存上的List内容,所有持有这个List引用的变量(包括其他实例的ColumnsList属性),自然都会看到同步变化后的结果。
修复方法
- 在构造函数中,不要直接把传入的List引用赋值给属性,为每个实例创建独立的List副本,切断不同实例、实例和外部源List之间的引用关联。
把构造函数内的赋值语句:ColumnsList = columnlist;
修改为:ColumnsList = new List<string>(columnlist);
改造后每个实例的ColumnsList都是专属的独立对象,互相之间的增删操作不会再产生关联影响。 - 后续如果有给
ColumnsList属性重新赋值的场景,同样需要做独立副本拷贝,不要直接把全局公共List、其他实例的List引用直接赋值,避免再次出现共享引用的问题。
补充说明:这个问题和类属性是否加
static修饰没有关系,只要是引用类型没有做独立副本拆分,就会出现跨变量同步修改的现象。
内容的提问来源于stack exchange,提问作者Kalpani
相关产品推荐
相关产品推荐

