namespace ConsoleApplication14
{
    class Program
    {
        static void Main(string[] args)
        {
            Person[] beatles ={new Person("John","Lennon"),
                        new Person("Paul","McCartney")};
            Person[] beatlesClone = (Person[])beatles.Clone();
        }
    }
    public class Person
    {
        public Person()
        { }
        public Person(string firstName, string lastName)
        { this.Firstname = firstName;
        this.Lastname = lastName;
        }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        public override string ToString()
        {
            return string.Format("{0},{1}",Firstname,Lastname);
        }
    }
}
两个红色的对象是属于同个对象的引用吗?
这里clone()是创建深度复制吗?

解决方案 »

  1.   

    int intArray1={1,2};
    int intArray2=(int[])intArray1.clone();
    这里两个对象是同个引用吗,clone方法在这里是深度复制还是浅复制呢?
      

  2.   

    以上第一贴调试为浅度复制,即同个对象的引用
    第二贴为深度复制,既是两个独立的对象,
    请问这个是为什么?同样用clone()为什么一个是深度复制,一个是浅复制?
    是不是对于数组来讲 ,成员为值类型的话用clone方法就产生深度复制,而成员为引用类型的话clone方法就产生一个浅度复制呢?
      

  3.   

    那memberwiseclone()方法据说也是浅度复制,这个和Icloneable接口中的Clone()方法到底什么区别啊?
      

  4.   

    system.object.memberwiseclone()也是浅度复制,我知道可以在类实例上调用,返回浅复制,跟数组调用clone()似乎效果相同了吧?
      

  5.   

    Clone方法是各个类自己实现的
    你的例子里的clone方法是Array类自己实现的Clone方法,它是用浅表克隆
    MemberwiseClone是object类实现的一个受保护的浅表克隆方法
    例如,如果你要自己实现Person类的clone方法(浅表克隆)可以这么写class Person:ICloneable
    {
            public object Clone()
            {
                return this.MemberwiseClone();
            }
    }深度克隆可以这么写class Person:ICloneable
    {
            public object Clone()
            {
                Person p=new Person();
                p.Firstname =this.Firstname;
                p.Lastname =this.Lastname;
                return p;
            }
    }实际上,你的两个例子都是浅度克隆,所以才会有Person[]的克隆对象修改后会影响原对象
    而int[]里的对象是int,值类型的修改不影响原来的值
    我给的两个例子效果是一样的,如果你在Person类中加上一个其他的对象效果就不一样了
    class Person:ICloneable
    {
         public Student Stu=new Student("张三");
         public object Clone()
            {
                return this.MemberwiseClone();
            }
    }class Person:ICloneable
    {
        public Student Stu=new Student("张三");
         public object Clone()
            {
                Person p=new Person();
                p.Stu=new Student("张三");
                return p;
            }
    }Person p=new Person();
    Person p1=(Person)p.Clone();p.Stu==p1.Stu是浅度克隆
    否则是深度克隆