如何停止对其他类对象的引用

本文关键字:对象 引用 其他 何停止 | 更新日期: 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,密封,但我没有得到结果。谁能告诉我如何停止obj1obj2的引用?

如何停止对其他类对象的引用

您想要深度克隆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";