首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遍历列表并修改对象就是更新原始的

遍历列表并修改对象就是更新原始的
EN

Stack Overflow用户
提问于 2013-01-11 22:23:52
回答 4查看 331关注 0票数 1

由于某些原因,我似乎找不出我做错了什么。我尝试了一些东西,每次原始记录都会被修改。

我有一个特定类的列表。我正在迭代列表,如果满足特定条件,我需要为此迭代创建一个重复项,修改两个值,然后将其添加到最终列表中。除了每次我修改我创建的副本时,这些值都会在原始副本中修改。数据是设置为列表的绑定列表。

代码语言:javascript
运行
复制
// MyClasses is a BindingList<MyClass>
List<MyClass> classesToSave = new List<MyClass>();
foreach (var class in MyClasses)
{
    classesToSave(class);

    if (class.NeedsDupe)
    {
        MyClass dupeClass = new MyClass();
        dupeClass = class;
        dupeClass.NeedsDupe = false;
        dupeClass.IsDupe = true;
        classesToSave(dupeClass);
    }
}

假设通过第一次迭代,MyClasses中的第一项具有class.NeedsDupe == true和class.IsDupe == false。如果在满足条件之前将类添加到classesToSave,则classesToSave中的唯一条目是原始类(class.NeedsDupe == true和class.IsDupe == false)。但是,当满足条件并修改dupeClass对象时,在将dupeClass添加到classesToSave之前,会修改classesToSave中的原始条目(也是唯一的条目)。

我是不是完全漏掉了什么?我有一种感觉,我正在画一个脑筋急转弯,也许需要一个旧物体的参考?或者我以某种方式复制了BindingList的属性,并且当我更改我认为是新对象的dupeClass对象时,实际上是导致更改返回到原来的对象?

谢谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-11 22:48:21

这就是类的本质,它们是引用类型。为MyClass创建复制构造函数

代码语言:javascript
运行
复制
class MyClass
{
   public MyClass(MyClass myClass)
   {
       //Assign the properties here
       //this.x = myClass.x;
       //....
       //....
   }
}

然后你调用

代码语言:javascript
运行
复制
MyClass dupeClass = new MyClass(@class);
票数 2
EN

Stack Overflow用户

发布于 2013-01-11 22:26:47

以下几行是有问题的。dupeclass引用这个类;它们指向同一个对象。将dupeClass的属性设置为与class的属性相等,而不是使它们相等。

代码语言:javascript
运行
复制
MyClass dupeClass = new MyClass();
dupeClass = class;
票数 2
EN

Stack Overflow用户

发布于 2013-01-11 22:27:41

在此行中,您将创建一个新的MyClass实例:

代码语言:javascript
运行
复制
MyClass dupeClass = new MyClass();

但随后您会立即用原始文件覆盖它:

代码语言:javascript
运行
复制
dupeClass = class;

从那时起,dupeClassclass都引用了同一个对象,因此对dupeClass的更改也会对class进行更改。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14280107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档