C# 如何为复制对象赋值而不影响原始对象

C# 如何为复制对象赋值而不影响原始对象,c#,class,oop,object,C#,Class,Oop,Object,我创建了3个对象,但当我更改3个对象中的一个对象属性时,所有对象的属性也会更改。 那么,如何更改对象属性而不影响其他对象呢 public DetachForm(MessageViewModel messageViewModel) { a = new MessageViewModel(); a = messageViewModel; var b = new MessageModel(); b = a.CurrentMessage; /

我创建了3个对象,但当我更改3个对象中的一个对象属性时,所有对象的属性也会更改。 那么,如何更改对象属性而不影响其他对象呢

public DetachForm(MessageViewModel messageViewModel)
{            
    a = new MessageViewModel();
    a = messageViewModel;
    var b = new MessageModel();
    b = a.CurrentMessage;
    //property name in messageViewModel,a and b object equal to "Old"
     b.Name = "New";
   //property name in messageViewModel,a and b object equal to "New"
}

这种行为来自C#处理对象引用的方式。当您这样做时:

b = a;

你说b应该引用和a相同的对象。无论使用a或b引用,您都在修改同一对象。

我认为您应该仔细查看实际发生的情况

public DetachForm(MessageViewModel messageViewModel)  //  <--- first object in memory
{            
    a = new MessageViewModel();  //  <--- create a new object in memory
    a = messageViewModel;  // <--- change the reference a to reference the messageViewModel
    var b = new MessageViewModel();  //  <--- create a new third object in memory
    b = a;  //  <--- change b to reference the same object as a

    a.id=1;  // At this point messageViewModel, a, b - all reference the same object in memory
}

即使在你的更新中,你也有同样的问题。以下代码相当于您在更新中编写的代码:

a = messageViewModel;
var b = a.CurrentMessage;
b.Name = "New";
因此,正如您所看到的,创建新实例并用“旧”实例覆盖它们并不重要。因此,当您更改
b.Name
时,实际上可以访问内存中与
a.CurrentMessage.Name
相同的对象

如果您想复制所有的
MessageViewModel
,那么我建议您查看
IClonable
(或者使用复制构造函数)。如果您的类将实现该接口,那么您可以:

var copy = messageViewModel.Clone();
copy.CurrentMessage.Name = "something"; // original will not change

有没有什么方法可以让我改变对象而不影响其他对象?@BenniTo-当然,但问题是你到底想改变什么?什么是
a
,什么是
messageViewModel
-如果我想更改对象b中的属性而不影响a和messageViewModel对象,那么我该如何处理它?那么在其他对象中更改属性对象如何?@BenniTo-请解释您实际尝试的操作。你错过了一些重要的基础知识。如果你做了
c=new…
,然后又做了
c=something
,那么你做了
new
…使用深度克隆来复制对象和中断引用并不重要。@KarthikAMR-这不是问题,因为在任何情况下都是一个新对象。你似乎需要克隆对象,试试iClonable。因为b=a正在更改您传递的messageViewModel的指针。
var copy = messageViewModel.Clone();
copy.CurrentMessage.Name = "something"; // original will not change