c#学习笔记-深度复制 与浅度复制
关于值类型和引用类型:
浅度复制(shallow copy)只复制值类型(char,int )的值,而对于引用类型不会复制,浅度复制可以通过派生于System.Object的MemberwiseClone()方法来完成,这是一个受保护的方法。因为他并没有考虑引用类型成员,因此新对象的引用成员就会指向源对象中的相同成员引用的对象
如果要创建成员的新实例(复制值,而不是复制引用)就需要用到深度复制(deep copy)
深度复制需要实现一个ICloneable接口,如果使用这个接口需要实现它包含的Clone()方法,这个方法返回一个System.Object的值,
下面看下浅度复制:
public class Company
{
public string value { get; set; }
} public class Phone
{
public string color { get; set; } public Company company = new Company(); public Phone (string newCompany)
{
company.value = newCompany;
} public object getCopy()
{
return MemberwiseClone();
}
}
static void Main(string[] args)
{
Phone phone = new Phone("xiaomi");
phone.color = "red";
Phone phone1 = (Phone)phone.getCopy();
Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}");
Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}"); Console.WriteLine("浅度复制修改新对象的值"); phone1.company.value = "huawei";
phone1.color = "green";
Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}");
Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}");
Console.ReadKey(); }
实验现象:

浅度复制在后引用类型修改后,原对象也跟着发生了改变
修改这个问题,可以使用深度复制
public class Company
{
public string value { get; set; }
} public class Phone:ICloneable
{
public string color { get; set; } public Company company = new Company(); public Phone (string newCompany)
{
company.value = newCompany;
} public object getCopy()
{
return MemberwiseClone();
} public object Clone()
{
Phone newPhone = new Phone(company.value);
return newPhone;
//newPhone.company.value = this.company.value; }
}
static void Main(string[] args)
{
Phone phone = new Phone("xiaomi");
phone.color = "red";
Phone phone1 = (Phone)phone.Clone();
Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}");
Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}"); Console.WriteLine("浅度复制修改新对象的值"); phone1.company.value = "huawei";
phone1.color = "green";
Console.WriteLine($"phone company:{phone.company.value} color: {phone.color}");
Console.WriteLine($"phone1 company:{phone1.company.value} color: {phone1.color}");
Console.ReadKey(); }
实验现象

c#学习笔记-深度复制 与浅度复制的更多相关文章
- .NET基础之深度复制和浅度复制
之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 如果大家不懂值类型和引用类型的区别,请先看http://www.cnblogs.com/Autumo ...
- C#深度复制和浅度复制
C#深度复制和浅度复制 复制一个值变量很简单,新建一个变量然后将原来的变量赋值过去就行,但是复制一个引用变量这种方法是不行的,如果不明白为什么可以先看看这篇解释 引用类型变量和值类型变量在赋值时的不同 ...
- Dynamic CRM 2013学习笔记(十四)复制/克隆记录
经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的 ...
- JavaScript学习笔记——JS中的变量复制、参数传递和作用域链
今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执 ...
- java学习笔记之字符流文件复制
字符文件复制 FileReader fr =new FileReader("b.txt");//绑定源文件 FileWriter fw= new FileWriter(" ...
- MongodDB学习笔记(二)(复制)
mongoDB的复制非常容易配置,其实现有两种方式,一种是主从复制,一种是复制集,前者的好处是容易配置,但是如果主服务器宕掉了,整个系统就崩溃了,后者的好处是如果主服务器宕掉了,其他服务器会通过投票选 ...
- Linux学习笔记:cp和scp复制文件
拷贝文件和文件夹,在Linux上通过cp命令来实现. cp:用户当前机器的文件复制 scp:通过ssh本机和其他机器的文件复制 secure copy cp a.txt b.txt scp a.txt ...
- redis学习笔记——RDB、AOF和复制时对过期键的处理
AOF.RDB和复制功能对过期键的处理 生成RDB文件 在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中.举个例 ...
- MongoDB学习笔记(六、MongoDB复制集与分片)
目录: MongoDB部署模型 MongoDB可复制集 MongoDB读写分离 分片架构部署 最佳实践 MongoDB部署模型: 单机 -> 可复制集 -> 分片集群 MongoDB可复制 ...
随机推荐
- HearthBuddy模拟对手的回合
start calculations, current time: 10:29:48 V2019.09.01.002 Rush 10000 face 27 berserk:1 ets 200 secr ...
- 使用oid2name列出数据库和对应的oid
[postgres@postgre base]$ ll total 172 drwx------ 2 postgres postgres 12288 Dec 6 09:21 1 drwx------ ...
- Angular 中的 dom 操作(ViewChild)以及父子组件中通过 ViewChild 调用子组件的方法
<app-header #header></app-header> <div #myBox> 我是一个dom节点 </div> <button ( ...
- LinearGradient线型渐变效果
public LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, TileM ...
- 24Flutter中常见的表单有TextField单行文本框,TextField多行文本框、CheckBox、Radio、Switch
一.Flutter常用表单介绍: CheckboxListTile.RadioListTile.SwitchListTile.Slide. 二.TextField:表单常见属性: maxLines:设 ...
- 25 Flutter仿京东商城项目 购物车页面布局
加群452892873 下载对应25课文件,运行方法,建好项目,直接替换lib目录,在往pubspec.yaml添加上一下扩展. cupertino_icons: ^0.1.2 flutter_swi ...
- (八)利用apache组件进行文件上传下载
一.文件上传 文件上传,即服务器端得到并处理用户上传的文件,这个文件存放在request里,也就是需要对request进行处理. 1.1 编写html文件 <!DOCTYPE html> ...
- iOS的推送证书过期的处理
1.删除MAC上钥匙串访问中对应的推送证书.<根据过期日期看> 2.登录苹果开发者后台,revoke删除已过期推送证书(貌似会自己消失不用删除,具体记不清了...),然后为对应App ID ...
- Flutter布局--appbar导航栏和状态栏
MaterialApp 先看下上图的具体用法:1. title:标题2. actions:表示右侧的按钮的动作3. leading:表示左侧的按钮的动作4. flexibleSpace:5. back ...
- SpringBoot Profile使用详解及配置源码解析
在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...