如何停止对其他类对象的引用
本文关键字:对象 引用 其他 何停止 | 更新日期: 2023-09-27 18:04:38
我在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
的引用?
您想要深度克隆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));
}
您应该克隆 obj1。可以使用MemberwiseClone()。
Myclass obj2 = (Myclass)obj1.MemberwiseClone();
见我上面的评论。MemberwiseClone的msdn文档很好地涵盖了这一点。
在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.
您看到的行为是因为您只是对单个对象有两个引用。不管你用哪个引用来获取对象,它仍然是同一个对象。我认为这是因为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
当您写obj2 = obj1
时,您正在使obj2指向obj1所指向的对象。您没有创建一个与obj1具有相同值的新单独实例。因此,为了防止对obj1所做的任何更改出现在obj2中,您需要对obj1进行深度复制,如下所示:
obj2 = new MyClass(obj1);
obj1.Name = "abc";