浅度复制VS深度复制

对于引用类型的复制,通过MemberwiseClone()复制的只是引用,即myclone1和myclone2的myContent是相同的对象实例。一个改变值,另一个也会改变。因为myContent.Val是公共字段。

值对象则没有这种顾虑

PS:感觉ICloneable 接口并没有什么用,完全可以自己写方法。毕竟ICloneable里面只有一个Clone方法。

代码如下:

 1    class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Cloner myclone1 = new Cloner(5);
 6
 7             // 浅度复制
 8             Cloner myclone2 = (Cloner)myclone1.GetCopy();
 9             Console.WriteLine("myclone2.myContent.Val:" + myclone2.myContent.Val);
10             myclone1.myContent.Val = 10; // 修改了myclone1,myclone2也会变
11             Console.WriteLine("myclone2.myContent.Val:" + myclone2.myContent.Val);
12
13             // 深度复制
14             Cloner myclone3 = (Cloner)myclone1.DeepClone();
15             Console.WriteLine("myclone3.myContent.Val:"+myclone3.myContent.Val);
16             myclone1.myContent.Val = 15; // 修改了myclone1,myclone2不会变
17             Console.WriteLine("myclone3.myContent.Val:" + myclone3.myContent.Val);
18
19             Console.ReadKey();
20         }
21     }
22
23     public class Content
24     {
25         public int Val;
26     }
27
28     public class Cloner //:ICloneable
29     {
30         public Content myContent = new Content();// 引用类型才行,值类型不行
31
32         public Cloner(int newVal)
33         {
34             myContent.Val = newVal;
35         }
36
37         public object GetCopy() // 浅度复制
38         {
39             return MemberwiseClone();// 创建浅表副本
40         }
41
42         public object DeepClone() // 深度复制
43         {
44             Cloner clonedCloner = new Cloner(myContent.Val);
45             return clonedCloner;
46         }
47     }

运行结果:

时间: 2024-10-08 14:17:49

浅度复制VS深度复制的相关文章

类的浅度复制和深度复制

现在我们定义一个类 //name.h class name { private: char *str; int len; static in num_name; //全局变量,不能在声明中初始化.(因为声明描述了如何分配内存,但不分配内存). public: name(); name(const char* s); name(const name& s); ~name(); } //name.cpp #include <cstring> #include <iostream>

转载---Java集合对象的深度复制与普通复制

原博文:http://blog.csdn.net/qq_29329775/article/details/49516247 最近在做算法作业时出现了错误,原因是没有弄清楚java集合的深度复制和浅度复制的区别. 1.首先是对Java集合对象得浅复制与深度复制的理解 普通的集合复制只是将内存中栈的地址快拷贝一份,使得一个新的集合对象指向这个地址块,但是集合中的对象变量却是指向堆中的同一块区域.所以当拷贝的集合修改了集合对象内的数据,那么源集合对象也就随之改变了,这样的效果我们称之为Java集合对象

对象的复制(浅复制与深复制)

在Java中如果想将一个基本类型变量的值赋给另一个变量,直接使用等号解可以了,原始的版本改变了,副本并不会发生变化,如下: int a=10; int b=a; a=9; System.out.println(a); //9 System.out.println(b); //10 但是如果想要复制的变量不是基本类型,而是引用类型的话,就会与上面的效果不同: package demos; /** * Created by hu on 2016/3/26. */ public class Peopl

.NET基础之深度复制和浅度复制

之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 大家都知道Object是所有类共同的基类,其有个方法是MemberwiseClone(),其用途为 我们可以通过这个方法来达到浅度复制的效果. 下面我们通过一个例子来阐述一下浅度复制,其与深度复制的区别在什么地方: public class Content { public int Val; } public class Cloner { public Content MyContent = ne

深度复制与浅度复制

浅度复制:只是复制类的值类型字段和引用类型字段的引用 深度复制:即完全复制过来,不管里面的值类型字段还是引用类型字段,是构成一个全新的一模一样的对象. 代码: 1 public class PersonInfo 2 { 3 public string Name{get;set;} 4 public int Age{get;set;} 5 } 6 public class Person : ICloneable 7 { 8 public PersonInfo PersonInfo { get; s

(原创)c#学习笔记09--定义类08--浅度和深度复制

9.8  浅度和深度复制 从一个变量到另一个变量按值复制对象,而不是按引用复制对象(即以与结构相同的方式复制)可能非常复杂.因为一个对象可能包含许多其他对象的引用,例如,字段成员等,这将涉及许多繁琐的操作.把每个成员从一个对象复制到另一个对象中可能不会成功,因为其中一些成员可能是引用类型. .NET Framework 考虑了这个问题.简单地按照成员复制对象可以通过派生于System.Object的MemberwiseClone()方法来完成,这是一个受保护的方法,但很容易在对象上定义一个调用该

react中需要用到【深度复制】的问题

首先,说一下我所遇到的问题,我所做的项目是用的基于react的antd框架. 一张表格,里面的数据是从后台获取直接渲染,我点击修改按钮,在modal弹框中修改数据,但是没有点击确定,点击取消,发现页面上的数据也被修改了,一刷新页面,数据就还原了. 纠结了很久,网上好像也没有类似的问题,百度了很久才知道原来是要深度复制的原因,所以写的博客记录一下. 1.问题的原因 以前用angular做项目,也遇到过类似问题.由于angular中双向绑定的问题,问题比在react中还明显一些,在modal弹框中输

javascript 数组的深度复制

javascript 数组的深度复制 一般情况下,使用 "=" 可以实现赋值.但对于数组.对象.函数等这些引用类型的数据,这个符号就不好使了. 1. 数组的简单复制 1.1 简单遍历 最简单也最基础的方式,自然是循环处理.示例: function array_copy(arr) { var out = [], i, len; if (out[i] instanceof Array === false){ return arr; } for (i = 0, len = arr.lengt

LeetCode138 Copy List with Random Pointer(深度复制带有随机指针的链表) Java题解

题目: A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 解题: 这题是要复制一个链表,这个链表比普通的链表多一个指针,这个指针可以指向任意地方,可以为空也可以为链表中的任一个节点,今天中午的时候我同学和我说起这题,当时问