博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深拷贝与浅拷贝
阅读量:6078 次
发布时间:2019-06-20

本文共 2338 字,大约阅读时间需要 7 分钟。

项目中,经常会遇到要创建一个对象的副本作为临时变量或其它用途,需要new一个新对象出来,

然后把源对象的各个属性赋值给这个新对象,这样,及时改变了新对象的属性,源对象也不会发生改变,即深拷贝。

显然,硬编码地把对象的一个个属性赋值给另外一个对象,不仅繁琐,而且容易出错,对象的类删掉一个属性,

则这个副本需“减掉”这个属性。

以Employee类为例,下面的代码实现了Employee的深拷贝与浅拷贝:

Employee类:

[Serializable]    public class Employee:ICloneable    {        public string IDCode  { get; set; }        public int Age  { get; set; }        //注意Department类要贴上序列化的的标记[Serializable],        //因为Employee要被序列化,其所有属性都要可被序列化        public Department  Department  { get; set; }        ///         /// 深拷贝        ///         /// 
public Employee DeepClone() { using (Stream objectstream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(objectstream, this); objectstream.Seek(0, SeekOrigin.Begin); return formatter.Deserialize(objectstream) as Employee; } } /// /// 浅拷贝 /// ///
public Employee ShallowClone() { return Clone() as Employee; } /// /// 创建当前System.Object的浅表副本 /// ///
public object Clone() { return this.MemberwiseClone(); } }
View Code

 

Department类:

[Serializable]    public class Department    {        public string Name { get; set; }           public override string ToString()        {            return this.Name;        }    }
View Code

 

Main方法:

static void Main(string[] args)        {            Employee emp1 = new Employee            {                IDCode = "10086",                Age = 23,                Department = new Department { Name = "信息化部" }            };            //浅拷贝            //Employee emp2 = emp1.ShallowClone() as Employee;            //深拷贝            Employee emp2=emp1.DeepClone() as Employee;            //修改emp2,emp1的各个属性不会被修改            emp2.IDCode = "10087";            emp2.Age = 24;            emp2.Department.Name= "研发部";            //输出验证            Console.WriteLine("编号:{0},部门:{1},年龄:{2}",emp1.IDCode,emp1.Department,emp1.Age);            Console.WriteLine("编号:{0},部门:{1},年龄:{2}", emp2.IDCode, emp2.Department, emp2.Age);            Console.ReadKey();        }
View Code

 

运行截图:

 

总结:emp2为emp1深拷贝的副本,修改emp2的属性,emp1的属性不会改变。

 

转载于:https://www.cnblogs.com/527289276qq/p/4621146.html

你可能感兴趣的文章
Lync 小技巧-4-我是否应该用动态内存
查看>>
写给同事的一封信
查看>>
详解Kafka生产者Producer配置
查看>>
SQL Server 2012笔记分享-9:理解列存储索引
查看>>
基于2.8版本redis配置文件中文解释
查看>>
《从零开始学Swift》学习笔记(Day 49)——扩展声明
查看>>
SFB 项目经验-58-Exchange 2016-POP3-配置-几年之伤(生产环境)
查看>>
网络资源管理系统LANsurveyor实战体验
查看>>
Windows 10 Build 9879 新变化(内含ISO下载)
查看>>
SFB 项目经验-39-分配公网证书 For 反向代理服务器 TMG 2010(图解)
查看>>
幼儿园小朋友可以教创业者的事
查看>>
SharePoint Server 2013 之二:准备数据库
查看>>
db link的查看创建与删除
查看>>
perl学习5--子程序中自动识别参数
查看>>
C#--GDI+的PathGradientBrush类的使用
查看>>
sql server 查询任务管理器数据
查看>>
让office2007支持公司痕迹保留
查看>>
【android】使用handler更新UI
查看>>
提取图标
查看>>
C++中的static
查看>>