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

时间:2015-07-24 06:31:03

标签: c#

我在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

5 个答案:

答案 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)。

由于您似乎需要值类型语义,或许您希望MyClassstruct,因此在分配时创建副本:

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";