在学习原型模式的时候,需要实现ICloneable时,调用object的MemberwiseClone(浅表副本)方式时发现一个问题:
MemberwiseClone方法只会将值类型完全Clone,引用类型在Clone时只复制引用。
在我的实验中发现string类型的对象在MemberwiseClone之后地址发生了变化。
class PrototypePattern : ICloneable
{
public String name;
String info;
String college;
public PrototypePattern(String name, String info, String college)
{
this.name = name;
this.info = info;
this.college = college;
Console.WriteLine("奖状创建成功!");
}
public void setName(String name)
{
this.name = name;
}
String getName()
{
return (this.name);
}
public void display()
{
Console.WriteLine(name + info + college);
}
public Object Clone()
{
Console.WriteLine("拷贝成功!");
return base.MemberwiseClone() as PrototypePattern; ;
}
}
static void Main(string[] args)
{
PrototypePattern obj1 = new PrototypePattern("张三", "同学:在2016学年第一学期中表现优秀,被评为三好学生。", "韶关学院");
obj1.display();
PrototypePattern obj2 = (PrototypePattern)obj1.Clone();
Console.WriteLine(obj1.name.Equals(obj2.name));
//obj2.setName("李四");
obj2.name += "李四";
Console.WriteLine(obj1.name.Equals(obj2.name));
obj2.display();
obj1.display();
Console.ReadLine();
}
String类型本质是引用类型,但是String类型指向是一个常量,所以每次修改时需要重新创建一个新的常量字符串,所以有了值类型的效果。