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

C#全局列表添加对象时被重复覆盖问题技术咨询

解决全局列表添加新对象时旧对象被覆盖的问题

嘿,我来帮你搞定这个问题!你说每次往Kosarica列表里加新的Izdelek对象,结果旧的都被新的覆盖了,哪怕每次调用函数都创建了新实例?这种情况我碰到过好几次,大概率是这几个原因之一,咱们一步步排查:

可能的原因及解决方案

1. 你其实没真正创建新实例,只是复用了同一个引用

最常见的情况是:你以为自己创建了新对象,但实际上只是把lista里的同一个对象引用加到了Kosarica里。比如你可能写了这样的代码:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    // 直接拿lista里的对象引用,没有创建新实例
    Izdelek nov = lista[izbrani_index];
    Kosarica.Add(nov);
    // 之后如果修改nov的属性,Kosarica里所有这个引用的对象都会跟着变
}

解决办法:创建原对象的深拷贝,也就是生成一个全新的Izdelek实例,把原对象的属性值复制过去:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    // 从lista里拿到原对象
    Izdelek original = lista[izbrani_index];
    // 创建新实例,复制所有属性
    Izdelek nov = new Izdelek
    {
        Id = original.Id,
        Ime = original.Ime,
        // 把你需要的其他属性都复制一遍
    };
    Kosarica.Add(nov);
}

或者更优雅一点,给Izdelek类加个克隆方法:

public class Izdelek
{
    public int Id { get; set; }
    public string Ime { get; set; }
    // 其他属性

    // 实现克隆方法
    public Izdelek Clone()
    {
        return new Izdelek
        {
            Id = this.Id,
            Ime = this.Ime,
            // 复制所有属性
        };
    }
}

// 调用时就很简洁
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    Izdelek nov = lista[izbrani_index].Clone();
    Kosarica.Add(nov);
}

2. Izdelek类的属性是静态的

如果你的Izdelek类里的字段/属性加了static关键字,那所有实例都会共享这些值,不管你创建多少个实例,修改其中一个的属性,所有实例的这个属性都会跟着变。比如:

public class Izdelek
{
    // 静态属性:所有实例共用同一个值
    public static int Id { get; set; }
    public static string Ime { get; set; }
}

解决办法:把static关键字去掉,改成实例属性,这样每个Izdelek实例都有自己独立的属性值:

public class Izdelek
{
    // 实例属性:每个实例各自持有值
    public int Id { get; set; }
    public string Ime { get; set; }
}

3. 全局列表被意外重置了

检查一下你的代码里,有没有在每次调用GridView1_RowCommand的时候,重新初始化了Kosarica列表?比如这样:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    // 每次调用都重新创建列表,之前加的元素全没了
    Kosarica = new List<Izdelek>();
    // 然后添加新对象,看起来像是旧的被覆盖了
    Izdelek nov = new Izdelek();
    Kosarica.Add(nov);
}

解决办法:确保Kosarica只初始化一次,比如在类的构造函数里初始化:

public YourPageClass()
{
    Kosarica = new List<Izdelek>();
    lista = new List<Izdelek>();
}

验证方法

你可以在添加对象后,打印每个对象的引用标识,确认是不是真的不同实例:

foreach(var item in Kosarica)
{
    // 打印引用的哈希码和Id,看看是不是每个都不一样
    Debug.WriteLine($"对象引用哈希:{item.GetHashCode()},Id:{item.Id}");
}

如果所有对象的哈希码都一样,说明你加的是同一个实例;如果哈希码不同但Id相同,那只是属性值一样,不是覆盖;如果哈希码不同Id也不同,那就是正常的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:18:40