c# 深拷贝与浅拷贝的区别分析及实例
发布时间:2023-06-29 05:00:06
深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。
浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。
C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量。对于前者,copy是属于全盘复制;而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样。因此 对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现ICloneable接口中提供的Clone方法。
看看定义:
浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.
深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.
浅拷贝和深拷贝的区别
浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象 中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一 个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对 象中对应字段的内容。所以对于原型模式也有不同的两种处理方法:对象的浅拷贝和深拷贝。
下面通过实例可以清楚看到浅拷贝与深拷贝的区别,代码如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace WindowsApplication1
{
class Program
{
public class Sex
{
private string _PSex;
public string PSex
{
set
{
_PSex = value;
}
get
{
return _PSex;
}
}
}
public class Person : ICloneable
{
private Sex _pSex = new Sex();
public int aa = 1213;
public string pSex
{
set
{
_pSex.PSex = value;
}
get
{
return _pSex.PSex;
}
}
private string _PName;
public string PName
{
set
{
this._PName = value;
}
get
{
return this._PName;
}
}
public void ShowPersonInfo()
{
Console.WriteLine("-------------------------");
Console.WriteLine("Name:{0} Sex:{1}", _PName, this.pSex);
Console.WriteLine("-------------------------");
Console.WriteLine(this.aa);
}
//浅拷贝
public object Clone()
{
return this.MemberwiseClone();
}
//深拷贝
public object DeepClone()
{
Person newP = new Person();
newP.PName = this._PName;
newP.pSex = this.pSex;
return newP;
}
}
static void Main(string[] args)
{
Console.WriteLine("原对象:");
Person p = new Person();
p.PName = "JackLee";
p.pSex = "男";
p.ShowPersonInfo();
//浅拷贝
Person copy = (Person)p.Clone();
//深拷贝
Person dcopy = (Person)p.DeepClone();
Console.WriteLine("修改后的原对象:");
p.PName = "JackZhao";
p.pSex = "女";
p.aa = 1111;
p.ShowPersonInfo();
Console.WriteLine("修改后的浅拷贝对象:");
copy.ShowPersonInfo();
Console.WriteLine("修改后的深拷贝对象:");
dcopy.ShowPersonInfo();
Console.WriteLine("直接拷贝对象:");
Person PP = p;
PP.ShowPersonInfo();
Console.ReadLine();
}
}
}
好了,关于深拷贝与浅拷贝就说到这里,项目还没完事,先抓紧了。代码可以直接复制到项目中运行。
猜你喜欢
- 前言:发送邮件,肯定是每个公司都会有的基本业务。很多公司都会选择把发送邮件作为一个基础服务,对外提供接口。直接调用就可发邮件了。但是我们都知
- 1. for循环示例#include <stdio.h>int main(){int i,j;int len=4;for(i=l
- 前言在上一篇文章中《Notification自定义界面》中我们实现了自定义的界面,那么我们该怎么为自定义的界面添加点击事件呢?像酷狗在通知栏
- 一、项目运行环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,
- 一、@RequestMapping@RequestMapping注解的源码:@Target({ElementType.TYPE, Eleme
- 前言在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,
- 本文实例为大家分享了Android屏幕适配工具类的具体代码,供大家参考,具体内容如下DimenToolgithub地址Android 屏幕适
- 在java开发中,类、接口、方法,都需要进行注释,注释内容如图:注释中的基本元素有:描述、作者、创建日期。可增加元素有:修改日期、修改内容、
- 本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时
- 本文实例讲述了Android实现跑马灯效果的方法。分享给大家供大家参考。具体如下:运行效果截图如下:直接在布局里写代码就好了:<Tex
- 没人会喜欢空指针异常!有什么方法可以避免它们吗?或许吧。。本文将讨论到以下几种技术1.Optional类型(Java 8中新引入的)2.Ob
- 本文以一个完整实例讲述了C#水印图片的生成方法。是非常实用的技巧。分享给大家供大家参考。具体实例代码如下:/** * 使用说明:
- 前言泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它。毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确
- 传统的单例写法解决了什么问题首先,在大多数情况下(不包含面试),传统的单例写法已经完全够用了。通过 synchronized 关键字解决了多
- 前言ps命令的作用是显示进程信息的。|符号,是个管道符号,表示左右两边两个命令同时执行。grep命令是查找(Global Regular E
- 程序触发鼠标、键盘事件是C#程序设计中比较常见的功能,本文实例展示了C#中winform实现自动触发鼠标、键盘事件的方法,有不错的实用价值。
- 注册中心呢 就是springcloud的一个核心组件 所有微服务的基石 微服务的核心思想就是分布式 所有的服务分开管理 但这些服务分开后该如
- 这篇文章使用Java组件显示窗口,在通过输入的图片url地址在窗口中显示出来,可作为一个网络图片查看器,感兴趣的可以打包成jar或者.exe
- 前言最近代码里和WebView有很多的交互,webview是android中的浏览器控件,这里主要介绍一下webview如何重载WebVie
- SpringMVC AbstractAnnotationConfigDispatcherSerServlet3.0环境中,容器会在类路径中查