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
相关产品推荐
相关产品推荐

