所以我正在阅读我的C#书,它有一个如何创建方法来创建对象的深层副本的示例:
[Serializable]
public class DeepClone : IDeepCopy<DeepClone>
{
public int data = 1;
public List<string> ListData = new List<string>();
public object objData = new Object();
public DeepClone DeepCopy ()
{
BinaryFormatter BF = new BinaryFormatter();
MemoryStream memSfream = new MemoryStream();
BF.Serialize(memStream,this);
memStream.Flush();
memStream.Position = 0;
return (DeepClone)BF.Deserialize(memStream);
}
}
但方法DeepCopy
足够通用,不依赖于其他成员
public int data = 1;
public List<string> ListData = new List<string>();
public object objData = new Object();
的对象。据我所知,这个方法可以放在任何class
中,并且可以正常工作。此外,如何复制对象是许多C#程序员在第一次使用该语言时所具有的问题,this thread的受欢迎程度证明了这一点。
这提出了我为什么System.Object
没有给出克隆功能的问题。我认为程序员毕竟需要Clone
方法而不是GetHashcode
方法。
答案 0 :(得分:3)
并非所有课程都支持克隆。单个对象的定义无法克隆。 OO规定此类不应包含Clone
方法。由于类无法避免继承System.Object
,因此不应在该级别引入该方法。 (同样的推理应该适用于方法ToString()
,Equals()
和GetHashCode()
,但我想有人会另有决定。)
除了接口方面,克隆并不像看起来那么简单,例如当子对象存储对父母的引用时。例如,在克隆(WinForms或其他)控件时,您可能也希望克隆子控件,而不是父控件。现在哪些参考文献需要克隆而哪些不需要克隆?这使得对所有情况都很难(如果不是不可能)实现克隆。