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

浅克隆:复制一个现有对象,引用类型指向同一个内存块(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. datasnap的初步

    datasnap的初步-回调函数 服务器端 TServerMethods1 =class(TComponent) private { Private declarations } public { P ...

  2. yum 报错

    Loaded plugins: fastestmirror, prestoLoading mirror speeds from cached hostfileCould not retrieve mi ...

  3. xshell密码不让输入 修改

    不允许点击输入密码:解决方案 https://zhidao.baidu.com/question/2266139012830466068.html

  4. ClassLoader热加载的简单实现

    当我们在eclipse中修改了一个.java文件时,并通过[ctrl + s ]保存了此java文件,相应的bin目录中,会发现.class文件也发生了修改.通常情况下,java文件是在我们的web项 ...

  5. 【转】Jmeter Http请求界面解释

    一个HTTP请求有着许多的配置参数,下面将详细介绍: 名称:本属性用于标识一个取样器,建议使用一个有意义的名称. 注释:对于测试没有任何作用,仅用户记录用户可读的注释信息. 服务器名称或IP :HTT ...

  6. python3+ros+telnet+telnetlib

    利用python3的telnetlib模块 远程登录ros,输入帐号密码,然后执行命令,并导出结果到txt文本: 不过实际操作这种方式不行,因为telnet导出来的文本文件,带颜色编码,根本无法看哦. ...

  7. 字符编码py2,py3操作,SecureCRT的会话编码的设置

    对之前的字符串类型和二进制类型(bytes类型),可以这样关联记忆,把字符串类型当作是Unicode,把bytes类型当作是GBK或者UTF-8或者是日文编码.这样字符串要转成二进制,那么就需要编码e ...

  8. zabbix设置sendmail发送邮件

    http://blog.csdn.net/xin_yu_xin/article/details/45115723 

  9. selenium webdriver 的事件处理

    package www.zr.com; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; imp ...

  10. 2014.8.27 Vs2005宏的使用

    终于知道怎么像在Word里那样使用宏了! 1.vs2005必须装补丁1 2.在C:\Program Files (x86)\Common Files\microsoft shared\VSA\8.0\ ...