如果我有如下代码:
class Student
{
public string RollID { get; set; }
}
class Person
{
public Student student { get; set; }
public string Address { get; set; }
public string Name { get; set; }
public Person Clone()
{
return (Person)this.MemberwiseClone();
}
}
class Client
{
static void Main()
{
Student s1 = new Student();
s1.RollID = "151";
Person p1 = new Person();
p1.Address = "bombay";
p1.Name = "foo";
p1.student = s1;
Person p2 = p1.Clone();
p2.student.RollID = "1558";
Person p3 = p1;
p3.student.RollID = "454";
}
}
当我改变p2的值时,p1的值也会改变,当我改变对象p3的值时,也是同样的结果。我的问题是,如果两者逻辑相同,那么在赋值和使用MemberwiseClone()
方法之间的真正区别是什么?如果我使用MemberwiseClone()
方法,还有其他优势吗?
string
是一个引用类型。克隆操作已经复制了你的属性值。你仍然拥有同一个Student
实例的引用,这就是为什么更新它的属性会影响到两个副本的原因。 - Charles Mager