C#的深拷贝和浅拷贝
也许会有人这样解释C# 中浅拷贝与深拷贝区别:
浅拷贝是对引用类型拷贝地址,对值类型直接进行拷贝。
不能说它完全错误,但至少还不够严谨。比如:string 类型咋说?
其实,我们可以通过实践来寻找答案。
首先,定义以下类型:
int 、string 、enum 、struct 、class 、int[ ] 、string[ ]
代码如下:
| //枚举 |
| public enum myEnum |
| { _1 = 1, _2 = 2 } |
| //结构体 |
| public struct myStruct |
| { |
| public int _int; |
| public myStruct(int i) |
| { _int = i; } |
| } |
| //类 |
| class myClass |
| { |
| public string _string; |
| public myClass(string s) |
| { _string = s; } |
| } |
| //ICloneable:创建作为当前实例副本的新对象。 |
| class DemoClass : ICloneable |
| { |
| public int _int = 1; |
| public string _string = "1"; |
| public myEnum _enum = myEnum._1; |
| public myStruct _struct = new myStruct(1); |
| public myClass _class = new myClass("1"); |
| //数组 |
| public int[] arrInt = new int[] { 1 }; |
| public string[] arrString = new string[] { "1" }; |
| //返回此实例副本的新对象 |
| public object Clone() |
| { |
| //MemberwiseClone:返回当前对象的浅表副本(它是Object对象的基方法) |
| return this.MemberwiseClone(); |
| } |
| } |
注意:
ICloneable 接口:支持克隆,即用与现有实例相同的值创建类的新实例。
MemberwiseClone 方法:创建当前 System.Object 的浅表副本。
接下来,构建实例A ,并对实例A 克隆产生一个实例B。 然后,改变实例B 的值,并观察实例A 的值会不会被改变。
代码如下:
| class 浅拷贝与深拷贝 |
| { |
| static void Main(string[] args) |
| { |
| DemoClass A = new DemoClass(); |
| //创建实例A的副本 --> 新对象实例B |
| DemoClass B = (DemoClass)A.Clone(); |
| B._int = 2; |
| Console.WriteLine(" int \t\t A:{0} B:{1}", A._int, B._int); |
| B._string = "2"; |
| Console.WriteLine(" string \t A:{0} B:{1}", A._string, B._string); |
| B._enum = myEnum._2; |
| Console.WriteLine(" enum \t\t A:{0} B:{1}", (int)A._enum, (int)B._enum); |
| B._struct._int = 2; |
| Console.WriteLine(" struct \t A:{0} B:{1}", A._struct._int, B._struct._int); |
| B._class._string = "2"; |
| Console.WriteLine(" class \t\t A:{0} B:{1}", A._class._string, B._class._string); |
| B.arrInt[0] = 2; |
| Console.WriteLine(" intArray \t A:{0} B:{1}", A.arrInt[0], B.arrInt[0]); |
| B.arrString[0] = "2"; |
| Console.WriteLine(" stringArray \t A:{0} B:{1}", A.arrString[0], B.arrString[0]); |
| Console.ReadKey(); |
| } |
|
} 对于C# 深拷贝和浅拷贝的区别表现在引用类型,对于引用类型,浅拷贝的原对象变化,拷贝后的对象也会变化,深拷贝则原对象变化,拷贝后的对象不会变化
|
C#的深拷贝和浅拷贝的更多相关文章
- C#设计模式:原型模式(Prototype)及深拷贝、浅拷贝
原型模式(Prototype) 定义: 原型模式:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.被复制的实例被称为原型,这个原型是可定制的. Prototype Pattern也是一 ...
- Objective-C中的深拷贝和浅拷贝
在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...
- $.extend()的深拷贝和浅拷贝详细讲解
版权声明:作者原创,转载请注明出处! 语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 描述: 将两个或更多对象的内容合并到第一个对象 ...
- JavaScript中面向对象的的深拷贝和浅拷贝
理解深拷贝和浅拷贝之前需要弄懂一些基础概念,内存中存储的变量类型分为值类型和引用类型. 1.值类型赋值的存储特点, 将变量内的数据全部拷贝一份, 存储给新的变量. 例如:var num = 123 : ...
- C++深拷贝与浅拷贝
当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用.也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用.以下情况都会调用拷贝构造函数: (1)一个对 ...
- C++的深拷贝与浅拷贝
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面是一个类对象拷贝的简单例子. #i ...
- Python赋值语句与深拷贝、浅拷贝的区别
参考:http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-d ...
- [C#进阶系列]专题一:深入解析深拷贝和浅拷贝
一.前言 这个星期参加了一个面试,面试中问到深浅拷贝的区别,然后我就简单了讲述了它们的之间的区别,然后面试官又继续问,如何实现一个深拷贝呢?当时只回答回答了一种方式,就是使用反射,然后面试官提示还可以 ...
- 也来玩玩 javascript对象深拷贝,浅拷贝
经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One method of copying an object is ...
- OC中的深拷贝与浅拷贝
深拷贝(deep copy)与浅拷贝(shallow copy)的定义一直是有争论的. 一种理解是: 所谓的浅拷贝, 就是不完全的拷贝 NSString *s = @"123"; ...
随机推荐
- FFmpeg封装格式处理3-复用例程
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506653.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...
- [PKUWC 2018]随机游走
Description 题库链接 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\) ...
- Java框架之Struts2(六)
一.OGNL表达式语言 Ognl Object Graphic Navigation Language(对象图导航语言),它是一种功能强大的表达式语言(Expression Language,简称为E ...
- 【协议】1、tcp,http,socket协议介绍
1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...
- 【Spring】9、Spring中的事件Event
Spring的ApplicationContext 提供了支持事件和代码中监听器的功能. 我们可以创建bean用来监听在ApplicationContext 中发布的事件.ApplicationEve ...
- 详解promise、async和await的执行顺序
1.题目和答案 一道题题目:下面这段promise.async和await代码,请问控制台打印的顺序? async function async1(){ console.log('async1 sta ...
- Apache SkyWalking的架构设计【译文】
Apache SkyWalking提供了一个功能强大并且很轻量级的后端.在此,将介绍为什么采用以下方式来设计它,以及它又是如何工作的. 架构图 对于APM而言,agent或SDKs仅是如何使用libs ...
- JavaScript中的递归
译者按: 程序员应该知道递归,但是你真的知道是怎么回事么? 原文: All About Recursion, PTC, TCO and STC in JavaScript 译者: Fundebug 为 ...
- Ashampoo Driver Updater - 阿香婆驱动安装
Ashampoo Driver Updater 让系统更完美 – 永远有最新的驱动,出错或旧的驱动是每个电脑系统的恶梦.时不时,驱动会丢失或不可避免的过时.Ashampoo Driver Update ...
- 【代码笔记】Web-ionic-按钮
一,效果图. 二,代码.index.html文件如下所示. <!DOCTYPE html> <html> <head> <meta charset=" ...