.NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)
b.深拷贝(Deep Copy 深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.完全产生新对象。
如果你拷贝的对象中引用了某个外部的内容(比如分配在堆上的数据),那么在拷贝这个对象的时候,让新旧两个对象指向同一个外部的内容,就是浅拷贝;如果在拷贝这个对象的时候为新对象制作了外部对象的独立拷贝,就是深拷贝
这个C#里的概念与C++类似。我们可以参考以前的概念理解。 深拷贝与浅拷贝之间的区别基本可以从定义看出。首先浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。
a.浅拷贝: 通过赋值等操作直接实现,将对象中的值类型的字段拷贝到新的对象中。
b.深拷贝:通过赋值等操作直接实现,将对象中的值类型的字段拷贝到新的对象中。 和浅拷贝相同
a.浅拷贝: MemberwiseClone 方法创建一个浅副本,方法是创建一个新对象,如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用原始对象,与原对象引用同一对象。
这种情况需要为其实现ICloneable接口中提供的Clone方法。
/// 数组的=赋值(直接拷贝),也就是引用传递,指向的是同一个地址:
/// </summary>
public void MethodShallowCopyDirectly()
{
int[] ArrayInt = { 0, 1, 2, 3 };
//所以改变其中任意一个变量的值,另一个也会被改变
int[] NewArrayInt = ArrayInt;
//改变新的数组变量:
NewArrayInt[0] = 8;
Console.WriteLine("数组的复制(直接拷贝),改变新数组第一值为8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]);
}
/// <summary>
/// ArrayInt.CopyTo,创建以个新数组,不影响原来的值
/// </summary>
public void MethodShallowCopyArrayCopyTo()
{
int[] ArrayInt = { 0, 1, 2, 3 };
//CopyTo()方法
int[] NewArrayInt = new int[5];//创建以个新数组,按值拷贝,不影响原来的值
ArrayInt.CopyTo(NewArrayInt, 0);
NewArrayInt[0] = 8;
Console.WriteLine("Array.CopyTo,改变新数组第一值为8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]);
}
/// <summary>
/// Array.Copy浅拷贝,值类型的浅拷贝,创建以个新数组,按值拷贝,不影响原来的值
/// </summary>
public void MethodShallowCopyArrayCopy()
{
int[] ArrayInt = { 0, 1, 2, 3 };
//Copy()方法
int[] NewArrayInt = new int[4];
Array.Copy(ArrayInt, NewArrayInt, 0);//创建以个新数组,按值拷贝,不影响原来的值
NewArrayInt[0] = 8;
Console.WriteLine("Array.Copy,改变新数组第一值为8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]);
}
/// <summary>
/// Array.Clone(),浅拷贝
/// </summary>
public void MethodShallowCopyArrayClone()
{
int[] ArrayInt = { 0, 1, 2, 3 };
//Array Clone()方法
int[] NewArrayInt = ArrayInt.Clone() as int[];//按值拷贝,不影响原来的值
NewArrayInt[0] = 8;
Console.WriteLine("Array.Clone(),改变新数组第一值为8,原值{0},新值{1}", ArrayInt[0], NewArrayInt[0]);
}
/// <summary>
/// .浅拷贝:(引用类型),数组中的元素是引用类型,复制的是它的一个引用,改变新拷贝会改变原对象
/// </summary>
public void MethodShallowCopyStringArrayCopyTo()
{
string[] sArray ={ "string0", "string1", "string2" };
string[] sNewArray = sArray;
//浅拷贝一个新对象
sArray.CopyTo(sNewArray, 0);
//改变新对象的值这个时候源对象中的值也会被改变
sNewArray[0] = "FrankXuLei";
Console.WriteLine("数组的浅拷贝:(引用类型),改变第一值为FrankXuLei,原值{0},新值{1}", sArray[0], sNewArray[0]);
}
/// <summary>
/// //字符串数组的深拷贝,如果需要包含引用类型的数组的深副本,就必须迭代数组,创建新对象
/// </summary>
public void MethodDeepCopyStringArray()
{
string[] sArray = new string[] { "string0", "string1", "string2", "string3" };
string[] sNewArray = new string[4];//迭代数组,创建新对象
for (int i = 0; i < sArray.Length; i++)
{
string sTemp = string.Empty;
sTemp = sArray[i];
sNewArray[i] = sTemp;
}
sNewArray[0] = "FrankXuLei";
Console.WriteLine("数组的复制(直接拷贝),改变新数组第一值为FrankXuLei,原值{0},新值{1}", sArray[0], sNewArray[0]);
}
{
//名称,引用类型
public string _name = string.Empty;
//价格,值得类型
public int _price = 0;
//构造函数
public CarDeepClone()
{
}
//重载构造函数
public CarDeepClone(string name, int price)
{
_name = name;
_price = price;
}
//深拷贝,需要重新生成对象,返回的新对象的实例
public object Clone()
{
//深复制
CarDeepClone obj = new CarDeepClone();//重新创建 CarDeepClone的对象
//obj.Member= (ClassA)Member.Clone();
return obj;
}
}
{
//名称,引用类型
public string _name = string.Empty;
//价格,值得类型
public int _price = 0;
//构造函数
public CarShallowClone(string name, int price)
{
_name = name;
_price = price;
}
//浅拷贝,MemberwiseClone方式返回对象的浅副本
public object Clone()
{
return this.MemberwiseClone();//创建当前对象的浅副本 ,返回相同的对象引用
}
}
Console.WriteLine("Value Type Shallow Copy Demo 值类型浅拷贝。。。。。。。。。。。。。。。。。。");
_ShallowCopy.MethodShallowCopyDirectly();//直接赋值
_ShallowCopy.MethodShallowCopyArrayClone();//调用数组的Clone()方法,浅副本
_ShallowCopy.MethodShallowCopyArrayCopy();//ArrayCopy方法
_ShallowCopy.MethodShallowCopyArrayCopyTo();//ArrayCopyTo()方法
_ShallowCopy.MethodShallowCopyStringArrayCopyTo();//ArrayCopyTo()方法
_ShallowCopy.MethodDeepCopyStringArray();//深拷贝字符数组
//DeepCopy Test深拷贝,重新生成对象,对新对象的修改不会改变原来对象的值
Console.WriteLine("Object Deep Copy Demo 对象深拷贝。。。。。。。。。。。。。。。。。。。。。");
CarDeepClone _CarDeepClone1 = new CarDeepClone("Benz700",700);
//深拷贝
Console.WriteLine("DeepCopy Test深拷贝,原对象名字{0}", _CarDeepClone1._name);
CarDeepClone _CarDeepClone2 = _CarDeepClone1.Clone() as CarDeepClone;
Console.WriteLine("DeepCopy Test深拷贝,新对象名字{0}", _CarDeepClone2._name);
//修改新对象的名字
_CarDeepClone2._name = "Benz800";
Console.WriteLine("DeepCopy Test深拷贝,新对象名字修改为{0}", _CarDeepClone2._name);
//输出对象信息
Console.WriteLine("DeepCopy Test深拷贝,原对象名字为{0},新对象名字为{1}", _CarDeepClone1._name, _CarDeepClone2._name);
//ShallowCopy Test浅拷贝,新对象的修改会改变原来对象的值得
Console.WriteLine("Object Shallow Copy Demo 对象浅拷贝。。。。。。。。。。。。。。。。。。。。。");
CarShallowClone _CarShallowClone1 = new CarShallowClone("BMW3", 300);
Console.WriteLine("ShallowCopy Test浅拷贝,原对象名字{0}", _CarShallowClone1._name);
//浅拷贝对象
CarShallowClone _CarShallowClone2 = _CarShallowClone1.Clone() as CarShallowClone;
Console.WriteLine("ShallowCopy Test浅拷贝,新对象名字{0}", _CarShallowClone2._name);
//修改新对象名字
_CarShallowClone2._name = "BMW7";
Console.WriteLine("ShallowCopy Test浅拷贝,新对象名字修改为{0}", _CarShallowClone2._name);
//输出对象信息
Console.WriteLine("ShallowCopy Test浅拷贝,原对象名字{0},新对象名字{1}", _CarShallowClone1._name, _CarShallowClone2._name);
进行 值类型浅拷测试贝。分别包括: _ShallowCopy.MethodShallowCopyDirectly();直接赋值拷贝,
_ShallowCopy.MethodShallowCopyArrayClone();调用数组的Clone()方法,浅副本
_ShallowCopy.MethodShallowCopyArrayCopy();ArrayCopy方法
_ShallowCopy.MethodShallowCopyArrayCopyTo();ArrayCopyTo()方法
_ShallowCopy.MethodShallowCopyStringArrayCopyTo();ArrayCopyTo()方法
_ShallowCopy.MethodDeepCopyStringArray();深拷贝字符数组后面代码主要是对对象深浅拷贝的不同测试。
.NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)相关推荐
- 学习Java的深拷贝和浅拷贝
关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用 ...
- 联邦学习笔记—《Communication-Efficient Learning of Deep Networks from Decentralized Data》
摘要: Modern mobile devices have access to a wealth of data suitable for learning models, which in tur ...
- python笔记:深拷贝与浅拷贝
=号赋值,相当于一个引用 浅拷贝:只是最外面的一层的拷贝,内部的元素都只是拷贝了一个引用 深拷贝:全拷贝,不管是外面一层还是里面的所有层.都进行了拷贝.
- C++学习笔记-----输出数据的另一种写法(std::copy)
输出的数据的另一种写法 #include <iterator>vector<int> v{1, 2, 3, ...}; copy(v.begin(), v.end(), ost ...
- C++学习笔记(超详细笔记记录ing)
C++学习笔记(11) 学习是一件任重而道远的事情,与其焦虑不如动手起来,借助平台记录自己学习笔记,希望和大家多多交流,今天又是努力成为程序媛的一天! 17.类和对象 17.3 C++对象模型和thi ...
- clone是深拷贝还是浅拷贝_Python中的浅拷贝和深拷贝
本文翻译自copy in Python (Deep Copy and Shallow Copy),讲述了在Python语言中浅拷贝与深拷贝的不同用法.全文系作者原创,仅供学习参考使用,转载授权请私信联 ...
- SignalR学习笔记(三)Self-Host
SignalR可以借助Owin摆脱对IIS的依赖,实现Self-Host,使得SignalR有了部署在非Windows平台的可能. 什么是Owin Owin的英文全称是Open Web Interfa ...
- 2.1)深度学习笔记:深度学习的实践层面
目录 1)Train/Dev/Test sets 2)Bias/Variance 3)Regularization(重点) 4)Why regularization reduces overfitti ...
- Deep Learning(深度学习)学习笔记整理系列 | @Get社区
Deep Learning(深度学习)学习笔记整理系列 | @Get社区 Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net ...
最新文章
- Pentaho部署文档校验过程中遇到的一些问题和解决对策
- PythonNET网络编程3
- bootstrap ui
- hive 集成sentry
- Linux centOS 硬盘分区挂载
- 华为MatePad 11开启预售:鸿蒙OS加持 2499元起!
- php工场模式讲解,PHP设计模式之工厂模式详解
- 文件名lin.php是什么,Linsexu程序安装PHP详细软件教程
- matlab 例题sin,matlab基础练习题(带答案).doc
- python源码剖析-笔记2
- 全网最全流程面试解析 面试前必看!必收藏!
- 百度网盘超大容量100t、500t操作方法,轻松扩容如此简单,扩容工具,占位文件,免虚拟机
- HTML表单基本结构
- COJ 0358 xjr考考你数据结构(根号3)线段树区间修改
- 111-unsplash-for-chrome-2021-07-22
- 用计算机和电视机组成家庭影院,如何让我的电脑连上我的家庭影院?
- Exposure X7胶片滤镜模拟软件 PS/LR调色插件 500+特效预设
- 用好WordPress不可不知的函数(转)
- 计算机教育在线投稿,《计算机教育》杂志投稿的一些成功技巧
- 杭州星滔企业管理公司成立 马云持股
热门文章
- 高性能mysql看不懂_高性能mysql笔记1
- java desktop mailto,mailto在Java?
- 工业机器人导轨 百度文库_工业机器人或许开创一个全新的PLC时代
- 计算机网络把许多什么连接在一起,计算机网络技术基础知识汇总习题
- hal 双串口同时接收丢失数据_【STM32Cube_06】使用USART发送和接收数据(查询模式)...
- linux tcb,在Linux中从潜藏密码迁移至tcb怎么做?
- java 进度条_进度条Java
- Oracle/mysql联合查询union、union all
- android中的xml布局文件如何引用另一个xml布局文件,引用另一个layout.xml文件而不复制它...
- java暂停5s_java如何实现继续/暂停按钮