您的位置:首页 > 编程语言 > C#

简述C#中浅复制和深复制

2018-03-27 01:35 267 查看
引用类型直接进行“=”来复制是不可以的,简单的复制成员可以通过派生在System.Object中的MemberwiseClone()方法来完成。这是一个受保护的方法。
我们简单的代码实现如下: public abstract class Animal
{
public string Name { get; set; }
public double Weight { get; set; }
public abstract void Sounds();
}
public class Dog : Animal, ICloneable
{
public override void Sounds()
{
Console.WriteLine("{0}汪汪汪", Name);
}
public object Clone()
{
return (Object)this.MemberwiseClone(); //实现克隆方法
}
public object Clone(string name, double weight)
{
var dog = (Dog)this.Clone();
dog.Name = name;
dog.Weight = weight;
return dog;
}
}
Dog类实现了接口ICloneable。在main函数中编写测试代码 static void Main(string[] args)
{
Dog dog1 = new Dog { Name = "二黄", Weight = 20.0 };
dog1.Sounds();
var dog2 = (Dog)dog1.Clone("二哈", 19.0);
dog2.Sounds();
Console.ReadKey();
}运行结果如下



我们修改一下Dog类,添加主人Master public class Master
{
public string Name { get; set; }
}
public class Dog : Animal, ICloneable
{
private Master master;
public Dog()
{
master = new Master();
}
public override void Sounds()
{
Console.WriteLine("{0}家的狗:{1}正在汪汪汪叫", master.Name, Name);
}
public void SetMasterName(string name)
{
master.Name = name;
}
public object Clone()
{
return (Object)this.MemberwiseClone(); //实现克隆方法
}
public object Clone(string name, double weight)
{
var dog = (Dog)this.Clone();
dog.Name = name;
dog.Weight = weight;
return dog;
}
}这里引用了外部的对象 static void Main(string[] args)
{
Dog dog1 = new Dog { Name = "二黄", Weight = 20.0 };
dog1.SetMasterName("张三");
var dog2 = (Dog)dog1.Clone("二哈", 19.0);
dog2.SetMasterName("李四");
dog1.Sounds();
dog2.Sounds();
Console.ReadKey();
}结果如下:



这不是我们想看到的,我们需要修改引用Master类也实现ICloneable接口。 public class Master: ICloneable
{
public string Name { get; set; }
public object Clone()
{
return (Object)this.MemberwiseClone(); //实现克隆方法
}
}
public class Dog : Animal, ICloneable
{
private Master master;
public Dog()
{
master = new Master();
}
public override void Sounds()
{
Console.WriteLine("{0}家的狗:{1}正在汪汪汪叫", master.Name, Name);
}
public void SetMasterName(string name)
{
master.Name = name;
}
public object Clone()
{
return (Object)this.MemberwiseClone(); //实现克隆方法
}
public object Clone(string name, double weight)
{
var dog = (Dog)this.Clone();
dog.Name = name;
dog.Weight = weight;
dog.master= (Master)master.Clone();
return dog;
}
}最后得到我们想要的结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  浅复制 深复制