当前位置: 首页 > 编程语言 > C#

为什么更新列表中的实例会更新另一个列表中的相同实例?分享

时间:2023-04-10 14:24:09 C#

为什么更新一个列表中的实例会更新另一个列表中的相同实例?我在上课。公共类abc{publicinti=0;公共字符串a="";=======================================现在,我在列表中插入一些记录类型abc类列表c=newSystem.Collections.Generic.List();abca=newabc();aa="1";ai=1;c.添加(一);a=新的abc();aa="1";ai=2;c.添加(一);==============================================创建一个列表变量并添加一些过滤记录。列出temp=newSystem.Collections.Generic.List();temp.AddRange(c.Where(i=>ii==1));==================================================Query=通过执行以下代码行,c变量也将被更改。我知道两者都指向同一个内存位置。有没有办法修复此代码?foreach(abcdintemp){di=10;}根据需要创建对象的克隆。例如,如果i和a属性——它们应该是完整的属性!-你可以写temp.AddRange(c.Where(i=>ii==1).Select(o=>newabc{a=oa,i=oi}));这不是“为什么更新列表会更新其他A列表?”它是“为什么更新列表中的实例会更新另一个列表中的相同实例?”因为你正在使用一个类和这个类的同一个实例。列表list1=newList();list1.Add(新的abc());//newabc()创建abc()类的一个实例。我们称这个实例为myInstanceListlist2=newList();list2.Add(list1[0]);//在这里,您将相同的实例(即myInstance)添加到list2list1[0].a=5;//你修改实例myinstanceConsole.WriteLine(list2[0].a);//返回“5”(因为它始终是同一个实例myIsntance)要避免此行为,您有两个解决方案:创建一个克隆方法以克隆具有相同值的abc实例。公共类abc{publicinti=0;公共字符串a="";publicabcClone(abcinstanceToClone){abcresult=newabc();结果.i=instanceToClone.i;结果.a=instanceToClone.a;}或用结构替换类(然后你有一个值类型,但你不能有字段初始值设定项)publicstructabc{publicinti;//默认初始化为0publicstringa;//Initializedbydefaulttonull}我建议您阅读这篇优秀的文章,以了解C#的“基本”概念。(不是那么容易,但非常重要)对对象实例所做的更新对该实例的每个所有者都是可见的。无论在多少集合对象中找到变化,或者集合包含什么类型的集合,变化都会无处不在。这仅仅是因为集合只指向内存中的相同位置。无论你在哪里做出改变,它都会无处不在。如果你需要避免这种行为,你有两个选择:以上是C#学习教程:为什么更新一个列表中的实例会更新另一个列表中的相同实例?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——publicstructabc{inti;串一个;}abca,b;...ai=1;b=一个;/*为`b`分配新的内存位置,并从`a`复制值。因此,对`a`的更新不会影响`b`*/bi=2;if(ai==bi)thrownewException("i值相同");如需转载请注明出处: