如何在类中实现克隆和复制方法?

我有一个叫做Employee类,有3个属性叫做IDNameDept 。 我需要实现CopyClone方法吗? 当我使用CopyClone方法时,我需要避免Casting? 我该怎么做?

示例:与具有DataTable.Copy()DataTable.Clone() DataTable.Copy()相同。

您需要实现IClonable接口并为clone方法提供实现。 如果您想避免强制转换,请不要执行此操作。

一个简单的深度克隆方法可以是将对象序列化到内存然后反序列化它。 您的类中使用的所有自定义数据类型都需要使用[Serializable]属性进行序列化。 对于克隆,您可以使用类似的东西

  public MyClass Clone() { MemoryStream ms = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, this); ms.Position = 0; object obj = bf.Deserialize(ms); ms.Close(); return obj as MyClass; } 

如果您的类只有值类型 ,那么您可以使用复制构造函数或只是将值分配给Clone方法中的新对象。

您是否必须使用ICloneable接口,或者只是在通用接口中定义了两个名为CloneCopy方法就足够了?

 public class YourClass : ICloneable { // Constructor logic should be here public YourClass Copy() { return this; } public YourClass Clone() { return new YourClass(ID, Name, Dept); } } interface IClonable { T Copy(); T Clone(); } 

或者我误解了什么?

我想说的是你不必让它变得更复杂吗? 如果你需要你的对象符合某些类型,你可以自己编写它,如果.Net框架中指定的那个对于这种情况是复杂的。 您还应该定义与CloneCopy的区别,即它们对您意味着什么? 我知道有几个站点指定Clone是深拷贝,而Copy是浅拷贝。

你的意思是,如何实现ICloneable.Clone()并让它返回类本身的类型。

 public class MyType : ICloneable { public MyType Clone() //called directly on MyType, returns MyType { return new MyType(/* class-dependant stuff goes here */); } object ICloneable.Clone() // called through ICloneable interface, returns object { return Clone(); } } 

我经常看到复制构造函数被建议作为克隆方法的替代方法,但除了密封类之外,行为是非常不同的。 如果我有一个类型Car,它只支持属性VIN,BodyColor和BodyStyle,以及衍生类型FancyCar,它也支持InteriorFabric和SoundSystem,那么接受Car类型对象并使用Car copy构造函数复制它的代码将结束一辆车。 如果将FancyCar传递给此类代码,则生成的“复制”将是新的Car,其具有与原始汽车匹配的VIN,BodyColor和BodyStyle,但不具有任何InteriorFabric或SoundSystem。 相比之下,代码接受Car并在其上使用克隆方法,将FancyCar传递给代码将导致生成FancyCar。

除非有人想使用Reflection,否则任何克隆方法都必须在其基础上调用base.MemberwiseClone。 由于MemberwiseClone不是虚方法,我建议定义一个受保护的虚拟克隆方法; 您可能还希望通过定义具有相同名称的受保护范围的虚拟嵌套类来阻止任何子类调用MemberwiseClone(因此,如果后代类尝试调用base.MemberwiseClone,则不会将其解释为对此无意义的引用虚拟课)。

这是一个例子:

 namespace XXX { [Serializable] public class ItemChecklist : ICloneable { // [...here properties, attributes, etc....] object ICloneable.Clone() { return this.Clone(); } public ItemChecklist Clone() { return (ItemChecklist)this.MemberwiseClone(); } } } 

ie如果你使用这个函数,你将在“itemAdd”中拥有对象“itemTemp”的整个副本及其所有值。

 ItemChecklist itemAdd = itemTemp.Clone();