我在c#中有两个相同类的对象。
Myclass obj1 = new Myclass();
Myclass obj2 = null;
obj2 = obj1;
obj1.Name = "abc"; //"abc" will also assign to obj2.Name.
当我指定obj1.Name="abc"
时,它也会分配给obj2.Name
。我想阻止这个。我试过const,密封但我没有得到结果。
任何人都可以建议我如何在obj1
上停止引用obj2
?
答案 0 :(得分:3)
您希望深度克隆obj1
:
Myclass obj1 = new Myclass();
Myclass obj2 = DeepClone(obj1);
obj1.Name = "abc";
深度克隆对象的一种方法是对其进行序列化并将其反序列化。
这是一个使用json.net的例子:
public T DeepClone<T>(T instance)
{
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(instance));
}
答案 1 :(得分:2)
请参阅上面的评论。 msdn docs for MemberwiseClone涵盖了这一点。
在MyClass中添加以下方法:
public class MyClass
{
...
// make a shallow copy
public MyClass ShallowCopy()
{
return (MyClass) this.MemberwiseClone();
}
}
然后您可以使用ShallowCopy()
方法创建obj2
Myclass obj1 = new Myclass();
Myclass obj2 = obj1.ShallowCopy();
obj1.Name = "abc"; //"abc" won't assign to obj2.Name.
答案 2 :(得分:1)
您看到的行为是因为您只有两个对单个对象的引用。使用哪个参考来获取对象并不重要,它仍然是同一个对象。我假设这是因为MyClass
是引用类型(即class
)。
由于您似乎需要值类型语义,或许您希望MyClass
为struct
,因此在分配时创建副本:
struct MyClass
{
private string _name;
public MyClass(string name)
{
_name = name;
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
然后您的原始代码按您的意愿工作:
MyClass joe = new Myclass("Joe");
MyClass bob = joe;
bob.Name = "Bob";
Console.WriteLine(bob.Name); // Bob
Console.WriteLine(joe.Name); // Joe
在此处查看此行动:http://ideone.com/Xwnqsa
答案 3 :(得分:1)
你应该克隆 obj1。您可以使用 MemberwiseClone()。
<button on-click on-click="handleClick(someValue)">
答案 4 :(得分:0)
当您编写obj2 = obj1
时,您正在使obj2指向obj1指向的对象。您没有创建与obj1具有相同值的新单独实例。因此,为了防止您对obj1所做的任何更改出现在obj2中,您需要制作obj1的深层副本,如下所示:
obj2 = new MyClass(obj1);
obj1.Name = "abc";