简述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();
}
{
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;
}
}最后得到我们想要的结果:
我们简单的代码实现如下: 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;
}
}最后得到我们想要的结果:
相关文章推荐
- C#中的深复制和浅复制(在C#中克隆对象)
- C#的GC机制(来自网摘复制,未整理)
- C# 复制和克隆认识浅谈
- C#.NET里原型的解释和应用------浅表复制和深表复制
- c# 浅层复制与深层复制
- C#中struct的字节对齐、转换操作和复制为二进制数据(byte[])
- C#中的深复制和浅复制(在C#中克隆对象)
- C#复制、粘贴文本到剪贴板
- C#中怎么复制数组
- C#整理——深浅度复制
- C#中数组复制的4种方法
- 简述C#变量的隐式类型声明
- c#复制文件
- C#操作文件、文件夹(复制、删除、新增、设置只读)-技术&分享
- C# 快速高效率复制对象另一种方式 表达式树
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
- c#复制文件到指定文件夹
- C#使用FileStream复制多媒体文件
- 使用C#在进度条中显示复制文件的进度
- C# WinForm登陆窗体 密码输入框屏蔽右键、复制、粘贴