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()是创建深度复制吗?
{
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()是创建深度复制吗?
int intArray2=(int[])intArray1.clone();
这里两个对象是同个引用吗,clone方法在这里是深度复制还是浅复制呢?
第二贴为深度复制,既是两个独立的对象,
请问这个是为什么?同样用clone()为什么一个是深度复制,一个是浅复制?
是不是对于数组来讲 ,成员为值类型的话用clone方法就产生深度复制,而成员为引用类型的话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是浅度克隆
否则是深度克隆