我有一个这样的课程:
Public Class Dog{
public Dog(string name, int age){
Name = name;
Age = age;
}
public string Name { get; set; }
public int Age { get; set; }
}
然后我创建了这个类的实例
Dog jake = new Dog("Jake", 3);
当我尝试复制Class并更改其属性时,如
Dog buster = jake;
buster.Name = "Buster";
当我这样做时,杰克的名字也会改变
我该如何避免这种情况?
请注意,我正在使用的类包含如此多的属性,如果我可以复制类并更改我想要的属性,它将使我更容易。
答案 0 :(得分:5)
这是因为内存在C#中的工作方式。每个类对象实际上是指向内存中对象的指针 - 当您将一个变量分配给另一个时,您仍然使用相同的指针,因此,当您对一个对象进行更改时,修改相同的数据。
从技术上讲,如果你创建了所有的对象结构,它们就可以很好地复制,因为结构是值类型,因此传递副本。然而,这是非常不可取的,因为它限制了使用,特别是对于多态性,并且对于具有大量成员的对象的内存管理是个坏主意。
解决此问题的最佳方法是在类Dog上实现一个函数,它允许您将数据复制到新的Dog对象中。因此,你会打电话给
Dog buster = jake.Clone();
buster.Name = "Buster";
在Clone中,将当前Dog对象中的所有属性复制到一个新的Dog对象中。
编辑:回到c ++的根源,实现一个"复制构造函数"也很常见。它采用相同类型的参数并进行深层复制。 IE
Dog jake = new Dog() { Name = "Jake" };
Dog buster = new Dog(jake) { Name = "Buster" };
注意:上面的语法使用大括号,它允许您在创建类时设置属性和字段。虽然技术上编译糖,但它非常擅长使实例化调用更加简洁
答案 1 :(得分:2)
要构建@Aravol提供的答案,如果您有许多属性,可以使用反射来获取/设置克隆对象中的属性,以从您要克隆的对象中获取属性的值。见这里:
答案 2 :(得分:0)
当你做Dog buster = jake时。你创建一个指向jake的变量
所以当你做buster.name = buster时,你在技术上改变了jakes的名字。