前言:我们知道对象分引用类型和值类型。

浅克隆:复制一个现有对象,引用类型指向同一个内存块(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#中的体现形式的更多相关文章

  1. js的浅克隆和深克隆

    谈一谈个人对js浅克隆和深克隆的区别. 之前也看到很多博客在写,当然也有写的非常好的,但是个人觉得既然要分享就不要写的太深奥,尽量以简单易懂为主. 浅克隆其实就是 对象A = 对象B:如果改变了对象B ...

  2. 深入理解Java的浅克隆与深克隆

    前言 克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据,这样也能实现克隆的目的. 但当对象属性 ...

  3. Java的浅克隆与深克隆

    前言 克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据,这样也能实现克隆的目的. 但当对象属性 ...

  4. java浅克隆和深克隆,序列化和反序列化实现深克隆(封装序列化和反序列化操作)

    本篇博客内容: 一.浅克隆(ShallowClone)和深克隆(DeepClone) 二.序列化和反序列化实现深克隆 三.封装序列化和反序列化操作 ObjectOutputStream + 内存流By ...

  5. c#:浅克隆和深克隆,序列化和反序列化

    一.浅克隆和深克隆(浅复制和深复制)浅克隆和深克隆最典型的应用是数据集对象DataSet的Clone和Copy方法.Clone()方法用来复制DataSet的结构,但是不复制DataSet的数据,实现 ...

  6. 【Java一看就懂】浅克隆和深克隆

    一.何为克隆 在Java的体系中,数据类型分为基本数据类型和引用数据类型. 基本数据类型包括byte,short,int,long,float,double,boolean,char 8种,其克隆可通 ...

  7. Jquery浅克隆与深克隆

    Jquery浅克隆与深克隆 JavaScript部分 $("div").on('click', function() {//执行操作}) //clone处理一 $("di ...

  8. Jquery浅克隆与深克隆是什么

    Jquery浅克隆与深克隆是什么 一.总结 一句话总结:克隆的那些标签内容就是对应元素的html,事件就是那些绑定的事件. 1.jquery克隆的时候的注意事项是什么? 元素数据(data)内对象和数 ...

  9. Java必备技能:clone浅克隆与深克隆

    介绍 一直以来只知道Java有clone方法,该方法属于Object的,对于什么是浅克隆与深克隆就比较模糊了,现在就来补充学习一下. 概念 浅拷贝(浅克隆)复制出来的对象的所有变量都含有与原来的对象相 ...

随机推荐

  1. mongodb配置和基本操作

    MongoDB3.0新特性WiredTigerMMAPv1可插拔引擎API基于web的可视化管理工具 查看版本号mongod --version启动数据库 mongod --dbpath $dbpat ...

  2. 位数问题(dp 递推)

    位数问题 时间限制: 1 Sec  内存限制: 128 MB提交: 35  解决: 19[提交][状态][讨论版][命题人:quanxing] 题目描述 在所有的N位数中,有多少个数中有偶数个数字3? ...

  3. Linux下面的yum命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  4. linux下dmesg命令详解

    前言:     有时候想查看一下开机启动信息,可以通过这个命令查询. 1,命令格式 功能说明:显示开机信息.  语 法:dmesg [-cn][-s <缓冲区大小>]  补充说明:kern ...

  5. verilog 之语法学习

    1.使用非基数表示的十进制视为有符号数.使用基数表示的十进制被视为无符号数. 2.线网中的值被解释为无符号数,整型寄存器中的值被解释为有符号的二进制补码数,. 3.如果选择表达式的值为 x.z,或越界 ...

  6. 三级联动第二种方法 三级联动.html

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. c#中{set;get;}使用逻辑

    (先把结论提前)下面两种定义私有变量配合公有变量的方法都没有意义,除非有特殊的逻辑需要在set或get中,其它情况都等效于 public GM_Arc Arc {set;get;} //不进行初始化, ...

  8. 第三章 服务治理: Spring Cloud Eureka

    Spring Cloud Eureka是 Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能 服务治理 ...

  9. STM32用有源蜂鸣器实现闹钟的声响

    有源蜂鸣器的声音是固定的,工作电压恒定,改变通断电的时间获得不同时长的音响,譬如连续音.快速短音.慢速长音(类似莫尔斯电报)来区分不同的报警信息. 简单的说,有源蜂鸣器只能发出一种声音,因为它的频率是 ...

  10. c++builder 程序升级到c++builder10Seattle

    c++builder 程序升级到c++builder10Seattle的一些技巧提示. http://community.embarcadero.com/blogs/entry/migrating-l ...