You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例的属性,且要求修改不会互相影响,需要做深拷贝:

  1. 首先给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
            // 依次赋值所有需要拷贝的属性
        };
    }
}
  1. 赋值时逐个克隆元素生成新列表:
private void heatFinishedHandler(object sender, List<Kart> e)
{
    mainForm.enableControls();
    server.karts = e.Select(item => item.Clone()).ToList();
}

内容的提问来源于stack exchange,提问作者Laura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:06:02