【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的,对于什么是浅克隆与深克隆就比较模糊了,现在就来补充学习一下. 概念 浅拷贝(浅克隆)复制出来的对象的所有变量都含有与原来的对象相 ...
随机推荐
- java中String和char的区别
首先来看一下Java的数据类型.Java 包括两种数据类型: 1.原始数据类型(primitive data type):byte,short, char, int, long,float,doubl ...
- FPGA前世今生(三)
上期介绍了关于FPGA的IOB单元,这期我们介绍一下FPGA内部的其他资源,这些都是学好FPGA的基础.不管前世的沧桑,还是后世的风光,我们都要把我现在的时光,打好基础,学好FPGA. 大多数FPGA ...
- 分布式锁之三:mysql实现-待整理
下面我们来看下开源dubbo推荐的业界成熟的zookeeper做为注册中心, zookeeper是hadoop的一个子项目是分布式系统的可靠协调者,他提供了配置维护,名字服务,分布式同步等服务.对于z ...
- 迭代器-迭代对象-dir(a)可以查看该数据类型有多少种方法。range(10)在py3里就是一个迭代器,for循环实际就是迭代器的应用
迭代器 我们已经知道,可以直接作用于for循环的数据烈性有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str,bytes等: 一类是generator,数据结构,包括生成 ...
- 请尽可能详尽的解释AJAX的工作原理
第一步:创建ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp)) 第二步:判断数据传输方式(GET/POST) 第三步:打开链接 open() ...
- Python类(一)-实例化一个类
#-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(): n = 123 #类变量 def __init_ ...
- java - 只输出中文,(不包含标点)
String a ="12dss显示,‘:()中文只"; StringBuffer b = new StringBuffer(); for(int i = 0;i<a.len ...
- 每天一个Linux命令 - 【chkconfig】
[命令]:chkonconfig [语法]:chkconfig [选项] [功能介绍]:chkconfig 命令是Redhat兼容的Linux发行版中的系统服务管理工具,它可以查询和更新不同的运行等一 ...
- JBPM具体应用之decision节点的使用
JBPM工作流引擎为我们提供了许多的节点应用,每一个节点都有其不同的作用,其中有四个比较常用的节点,他们分别decision,fork,state和task.在本文中我们先介绍decision节点,余 ...
- 一个页面中内嵌页面 iframe元素
iframe.html: <!DOCTYPE html><html lang="en"><head> <meta charset=&quo ...