C# 复制类时创建类的新实例

C# 复制类时创建类的新实例,c#,class,clone,C#,Class,Clone,我有一门课是这样的: 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); 当我试图复制类并更改其属性时,如 Dog bust

我有一门课是这样的:

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);
当我试图复制类并更改其属性时,如

Dog buster = jake;
buster.Name = "Buster";
当我这样做的时候,杰克的名字也会改变

我怎样才能避免这种情况


请注意,我正在使用的类包含太多属性,如果我可以复制该类并更改所需的一个属性,这将使我的工作变得更加轻松

当你做狗屎=杰克时。创建一个指向jake的变量


因此,当你使用buster.name=buster时,从技术上讲,你就是在改变jake的名字。

这是因为C#中内存的工作方式。每个类对象实际上都是指向内存中某个对象的指针—当您将一个变量分配给另一个变量时,您仍然使用同一个指针,因此,在更改一个对象时修改相同的数据

从技术上讲,如果你把所有的对象都做成了结构,它们会很好地复制,因为结构是值类型,因此会传递副本。然而,这是非常不可取的,因为它限制了使用,特别是多态性,并且对于具有大量成员的对象的内存管理是一个坏主意

解决这个问题的最好方法是在类Dog上实现一个函数,它允许您将数据复制到一个新的Dog对象中。因此,你会打电话给我

Dog buster = jake.Clone();
buster.Name = "Buster";
在克隆中,将当前狗对象的所有属性复制到新的狗对象中

<>编辑:回到C++根目录,实现一个“复制构造函数”也是常见的,它使用相同类型的参数并生成一个深层拷贝。即

Dog jake = new Dog() { Name = "Jake" };
Dog buster = new Dog(jake) { Name = "Buster" };

注意:上面的语法使用花括号,这允许您在创建类时立即从类中设置属性和字段。虽然从技术上讲,它非常擅长在@Aravol提供的答案的基础上进行更简洁的实例化调用,但如果您有许多属性,则可以使用反射来获取/设置克隆对象中的属性,从而从克隆对象中获取属性值。请看这里:


请参见此处。现在,您只复制对对象的引用,这就是为什么更改该对象的属性会同时更改两者。它们引用同一个对象。在C++中,复制一个变量。不在C#,我漏掉了另一行。