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

C# List添加同日期同名称Food类对象时原有对象属性被覆盖如何解决

问题根因

你贴出的最小复现代码逻辑是正确的,实际运行不会出现属性覆盖问题,你真实业务代码的问题是复用了同一个Food类实例,没有为每个新条目创建独立对象。
C#中class属于引用类型,List<T>存储的是对象的内存引用,而非对象拷贝。如果你两次添加到列表的是同一个Food实例,后续对该实例的属性修改会同步到列表中所有指向该实例的引用上,就会出现"旧条目属性被覆盖"的现象。

为什么存数据库后再读取就正常

你将列表存入数据库再读取时,数据读取逻辑会为每一条数据库记录单独创建全新的Food实例,每个实例的内存地址独立,修改互不影响,因此功能正常。

解决方案
  1. 每次新增条目时强制创建新实例
    每次添加新的食物条目之前,必须调用new Food()生成独立的实例,禁止复用同一个Food对象:
// 错误写法:全局只new一次,反复修改同一个对象
Food food = new Food();
food.xxx = xxx;
foods.Add(food);
food.yyy = yyy;
foods.Add(food);

// 正确写法:每次新增都new新对象
Food food1 = new Food();
food1.xxx = xxx;
foods.Add(food1);

Food food2 = new Food();
food2.yyy = yyy;
foods.Add(food2);
  1. 增加拷贝构造函数(可选,适用于需要基于已有条目创建新条目的场景)
    给Food类添加拷贝构造方法,方便快速生成属性相同的独立新实例:
public class Food
{
    public string date = "";
    public string name = "";
    public float amount = 0;
    public short meal = 0;

    // 默认构造函数
    public Food(){}
    // 拷贝构造函数
    public Food(Food source)
    {
        date = source.date;
        name = source.name;
        amount = source.amount;
        meal = source.meal;
    }
}

使用示例:

Food newFood = new Food(existFood);
newFood.amount = 50; // 只会修改新实例的属性,不会影响原有实例
验证方法

可以在代码中调用每个Food实例的GetHashCode()方法,若两次添加的对象返回的哈希值相同,即可确认是复用了同一个实例的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:45:03