为什么没有在System.Object中放入Clone方法?

时间:2016-03-20 22:39:27

标签: c# .net serialization data-structures

所以我正在阅读我的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方法。

1 个答案:

答案 0 :(得分:3)

并非所有课程都支持克隆。单个对象的定义无法克隆。 OO规定此类不应包含Clone方法。由于类无法避免继承System.Object,因此不应在该级别引入该方法。 (同样的推理应该适用于方法ToString()Equals()GetHashCode(),但我想有人会另有决定。)

除了接口方面,克隆并不像看起来那么简单,例如当子对象存储对父母的引用时。例如,在克隆(WinForms或其他)控件时,您可能也希望克隆子控件,而不是父控件。现在哪些参考文献需要克隆而哪些不需要克隆?这使得对所有情况都很难(如果不是不可能)实现克隆。