C#中如何填充类内的List?添加元素被覆盖问题求助
解决嵌套类型中List添加元素被覆盖的问题
嘿,我太懂这种踩坑的懊恼感了!你遇到的问题几乎可以肯定是重复复用了同一个引用类型实例导致的——这是刚接触嵌套类型和引用类型时非常容易犯的经典错误。
问题根源
当你的master.quiz.answers是存储自定义类(比如Answer类)的List时,List里保存的并不是对象本身,而是指向对象内存地址的引用。如果每次添加元素时,你没有创建新的对象实例,而是反复修改同一个对象的属性再调用.Add(),那列表里的所有“条目”其实都是指向同一个内存地址的引用。最后你看到所有条目都变成最后一次修改的值,本质上是因为它们本来就是同一个对象。
错误示例(你大概率是这么写的)
// 先创建一个Answer对象 var myAnswer = new Answer(); // 第一次赋值并添加到列表 myAnswer.Val1 = 1; myAnswer.Val2 = 2; myAnswer.Val3 = 3; master.quiz.answers.Add(myAnswer); // 直接修改同一个对象的属性,再次添加 myAnswer.Val1 = 11; myAnswer.Val2 = 22; myAnswer.Val3 = 33; master.quiz.answers.Add(myAnswer);
这种写法下,List里的两个元素其实都是myAnswer的引用,所以最后查看时,两个条目都会显示11、22、33。
正确写法(每次添加都新建实例)
// 第一次添加:创建全新的Answer实例 var answer1 = new Answer(); answer1.Val1 = 1; answer1.Val2 = 2; answer1.Val3 = 3; master.quiz.answers.Add(answer1); // 第二次添加:再创建一个独立的Answer实例 var answer2 = new Answer(); answer2.Val1 = 11; answer2.Val2 = 22; answer2.Val3 = 33; master.quiz.answers.Add(answer2);
如果是在循环中批量添加元素,一定要把对象的创建放在循环内部,而不是外部:
// 错误写法:对象在循环外创建,全程复用同一个实例 // var answer = new Answer(); foreach (var item in yourDataList) { // 正确写法:每次循环都新建一个独立实例 var answer = new Answer(); answer.Val1 = item.Data1; answer.Val2 = item.Data2; answer.Val3 = item.Data3; master.quiz.answers.Add(answer); }
总结一下
记住:引用类型(比如自定义类、List、Dictionary等)的变量存储的是对象的引用,不是对象副本。要让List里的每个元素都是独立的条目,每次添加时都要创建全新的对象实例,而不是修改同一个实例后重复添加。
内容的提问来源于stack exchange,提问作者Barry Dysert
相关产品推荐
相关产品推荐

