C# 如何为复制对象赋值而不影响原始对象
我创建了3个对象,但当我更改3个对象中的一个对象属性时,所有对象的属性也会更改。 那么,如何更改对象属性而不影响其他对象呢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; /
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