C# List引用赋值后修改源数据同步变更的问题如何解决
问题原因
List<T>是C#中的引用类型,当前参数e、源kartlist、赋值后的server.karts三个变量均指向堆内存中的同一个列表对象,因此任意变量对列表的增删、清空操作都会同步到所有指向该对象的变量上,符合你观察到的现象。
实现独立副本的方案
根据你的业务场景选择对应方案即可:
仅隔离列表结构修改
如果后续不会修改Kart实例本身的属性,仅需要避免列表增删、清空操作的互相影响,直接通过List的构造方法创建浅拷贝即可:
private void heatFinishedHandler(object sender, List<Kart> e) { mainForm.enableControls(); // 基于原列表创建独立的新List实例 server.karts = new List<Kart>(e); }
该方案下,两个列表的元素仍指向相同的Kart实例,但列表本身是独立对象,调用e.Clear()只会清空参数e对应的列表,不会影响server.karts和源kartlist。
完全隔离所有修改
如果后续需要修改单个Kart实例的属性,且要求修改不会互相影响,需要做深拷贝:
- 首先给
Kart类添加克隆方法:
public class Kart { // 你的原有属性定义 public int KartId { get; set; } public double Speed { get; set; } public Kart Clone() { return new Kart { KartId = this.KartId, Speed = this.Speed // 依次赋值所有需要拷贝的属性 }; } }
- 赋值时逐个克隆元素生成新列表:
private void heatFinishedHandler(object sender, List<Kart> e) { mainForm.enableControls(); server.karts = e.Select(item => item.Clone()).ToList(); }
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

