【C#】浅克隆和深克隆的区别和在C#中的体现形式
前言:我们知道对象分引用类型和值类型。
浅克隆:复制一个现有对象,引用类型指向同一个内存块(string为最特殊的对象,这里当作值类型来看先)
public class User
{
public int Age { get; set; }
public string UserName { get; set; }
public List<string> List { get; set; }
public User ShallowCopy()
{
return this.MemberwiseClone() as User;
}
} class Program
{
static void Main(string[] args)
{
var user = new User();
user.List = new List<string>();
user.Age = ;
user.UserName = "lisi";
user.List.Add("lst1"); var cloneUser = user.ShallowCopy(); Console.WriteLine(user.List.Count());
Console.WriteLine(cloneUser.UserName);
Console.WriteLine(user.Age); cloneUser.Age = ;
cloneUser.UserName = "zhangsan";
cloneUser.List.Add("lst2"); Console.WriteLine(user.List.Count());
Console.WriteLine(cloneUser.UserName);
Console.WriteLine(user.Age);
Console.ReadKey(); }
}
Shallow Copy Code
输出值分别为:
1(user.List.Count(),这个说引用类型,我们看下面的输出)
lisi
1
2(这里我们在克隆以后,有添加一个值,我们说了他们指向同一个内存块,所以这里是2)
zhangsan
1
补充:
一个对象中的字段有的是值类型的,有的是引用类型的。对于值类型字段来说,它的值就是简单的值,而对于引用类型来说,它的值是地址。
浅复制在复制时,将这个对象的值字段和引用字段(均为非静态字段)全部复制过去,获得了这个对象的值和地址。
即:当其中一个对象的引用字段所指向的地址中的变量变化时,所有浅复制对象中的该引用字段都会发生变化。
深克隆:复制一个现有对象,引用类型指向另一个内存块(改变克隆对象的任何一个值都不会影响其他值)
public class User
{
public int Age { get; set; }
public string UserName { get; set; }
public List<string> List { get; set; } public User Clone()
{
return new User()
{
Age = this.Age,
UserName = this.UserName,
List = new List<string>() { this.List[] }
};
}
}
class Program
{
static void Main(string[] args)
{
var user = new User();
user.List = new List<string>();
user.Age = ;
user.UserName = "lisi";
user.List.Add("lst1"); var cloneUser = user.Clone();
cloneUser.Age = ;
cloneUser.UserName = "zhangsan";
cloneUser.List[] = "updatedlist"; Console.WriteLine(user.List[]);
Console.WriteLine(user.UserName);
Console.WriteLine(user.Age);
Console.ReadKey(); }
}
输出值为:
lst1
lisi
1
注:
所有引用类型都是深克隆
【C#】浅克隆和深克隆的区别和在C#中的体现形式的更多相关文章
- js的浅克隆和深克隆
谈一谈个人对js浅克隆和深克隆的区别. 之前也看到很多博客在写,当然也有写的非常好的,但是个人觉得既然要分享就不要写的太深奥,尽量以简单易懂为主. 浅克隆其实就是 对象A = 对象B:如果改变了对象B ...
- 深入理解Java的浅克隆与深克隆
前言 克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据,这样也能实现克隆的目的. 但当对象属性 ...
- Java的浅克隆与深克隆
前言 克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据,这样也能实现克隆的目的. 但当对象属性 ...
- java浅克隆和深克隆,序列化和反序列化实现深克隆(封装序列化和反序列化操作)
本篇博客内容: 一.浅克隆(ShallowClone)和深克隆(DeepClone) 二.序列化和反序列化实现深克隆 三.封装序列化和反序列化操作 ObjectOutputStream + 内存流By ...
- c#:浅克隆和深克隆,序列化和反序列化
一.浅克隆和深克隆(浅复制和深复制)浅克隆和深克隆最典型的应用是数据集对象DataSet的Clone和Copy方法.Clone()方法用来复制DataSet的结构,但是不复制DataSet的数据,实现 ...
- 【Java一看就懂】浅克隆和深克隆
一.何为克隆 在Java的体系中,数据类型分为基本数据类型和引用数据类型. 基本数据类型包括byte,short,int,long,float,double,boolean,char 8种,其克隆可通 ...
- Jquery浅克隆与深克隆
Jquery浅克隆与深克隆 JavaScript部分 $("div").on('click', function() {//执行操作}) //clone处理一 $("di ...
- Jquery浅克隆与深克隆是什么
Jquery浅克隆与深克隆是什么 一.总结 一句话总结:克隆的那些标签内容就是对应元素的html,事件就是那些绑定的事件. 1.jquery克隆的时候的注意事项是什么? 元素数据(data)内对象和数 ...
- Java必备技能:clone浅克隆与深克隆
介绍 一直以来只知道Java有clone方法,该方法属于Object的,对于什么是浅克隆与深克隆就比较模糊了,现在就来补充学习一下. 概念 浅拷贝(浅克隆)复制出来的对象的所有变量都含有与原来的对象相 ...
随机推荐
- mongodb配置和基本操作
MongoDB3.0新特性WiredTigerMMAPv1可插拔引擎API基于web的可视化管理工具 查看版本号mongod --version启动数据库 mongod --dbpath $dbpat ...
- 位数问题(dp 递推)
位数问题 时间限制: 1 Sec 内存限制: 128 MB提交: 35 解决: 19[提交][状态][讨论版][命题人:quanxing] 题目描述 在所有的N位数中,有多少个数中有偶数个数字3? ...
- Linux下面的yum命令详解
yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...
- linux下dmesg命令详解
前言: 有时候想查看一下开机启动信息,可以通过这个命令查询. 1,命令格式 功能说明:显示开机信息. 语 法:dmesg [-cn][-s <缓冲区大小>] 补充说明:kern ...
- verilog 之语法学习
1.使用非基数表示的十进制视为有符号数.使用基数表示的十进制被视为无符号数. 2.线网中的值被解释为无符号数,整型寄存器中的值被解释为有符号的二进制补码数,. 3.如果选择表达式的值为 x.z,或越界 ...
- 三级联动第二种方法 三级联动.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- c#中{set;get;}使用逻辑
(先把结论提前)下面两种定义私有变量配合公有变量的方法都没有意义,除非有特殊的逻辑需要在set或get中,其它情况都等效于 public GM_Arc Arc {set;get;} //不进行初始化, ...
- 第三章 服务治理: Spring Cloud Eureka
Spring Cloud Eureka是 Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能 服务治理 ...
- STM32用有源蜂鸣器实现闹钟的声响
有源蜂鸣器的声音是固定的,工作电压恒定,改变通断电的时间获得不同时长的音响,譬如连续音.快速短音.慢速长音(类似莫尔斯电报)来区分不同的报警信息. 简单的说,有源蜂鸣器只能发出一种声音,因为它的频率是 ...
- c++builder 程序升级到c++builder10Seattle
c++builder 程序升级到c++builder10Seattle的一些技巧提示. http://community.embarcadero.com/blogs/entry/migrating-l ...