C#浅拷贝与深拷贝测试

1.浅拷贝与深拷贝

  浅拷贝:只复制对象的基本类型,对象类型,仍属于原来的引用. 
      深拷贝:不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.

2.浅拷贝与深拷贝的区别

   浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用型字段的值他将反映在原始对象中,也就是说原始对象中对应的字段也会发生变化。

深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一个新的和原始对象中对应字段相同(内容相同)的字段,也就是说这个引用和原始对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对象中对应字段的内容。

3.浅拷贝与深拷贝测试

    public class TestClass
    {
        public TestClass()
        {
            this.Num = 1;
            this.Remark = "r";
            this.Data = new Data { Name = "a", SortNum = 1 };
        }

        public int Num { get; set; }
        public string Remark { get; set; }
        public Data Data { get; set; }

        //浅拷贝
        public TestClass Clone()
        {
            return (TestClass)this.MemberwiseClone();
        }

        //深拷贝
        public TestClass DeepClone()
        {
            TestClass t = new TestClass();
            t.Num = this.Num;
            t.Remark = this.Remark;
            t.Data = new Data { Name = this.Data.Name, SortNum = this.Data.SortNum };
            return t;
        }
    }

    public class Data
    {
        public string Name { get; set; }
        public int SortNum { get; set; }
    }

测试代码:

 static void Main(string[] args)
        {
            TestClass t1 = new TestClass();
            TestClass t2 = t1.Clone();
            TestClass t3 = t1.DeepClone();
            t1.Num = 2;
            t1.Remark = "r2";
            t1.Data.SortNum = 2;
            t1.Data.Name = "b";

            Console.WriteLine("t1   num:{0} remark:{1} name:{2} sortnum:{3}", t1.Num,t1.Remark, t1.Data.Name, t1.Data.SortNum);
            Console.WriteLine("t2   num:{0} remark:{1} name:{2} sortnum:{3}", t2.Num,t2.Remark, t2.Data.Name, t2.Data.SortNum);
            Console.WriteLine("t3   num:{0} remark:{1} name:{2} sortnum:{3}", t3.Num,t3.Remark, t3.Data.Name, t3.Data.SortNum);

            Console.ReadLine();
        }

测试结果:

时间: 2024-09-05 22:59:42

C#浅拷贝与深拷贝测试的相关文章

java浅拷贝与深拷贝详解

/** * @author MaskedMen *java深克隆与浅克隆讲解 *技术交流群:JAVA/WEB/安卓精英群 316278345 *联系邮箱:[email protected] */ public class CloneDemo { public static void main(String[] args) { Person maskedmen1 = new Person("maskedmen1",20); Fruit watermelon = new Fruit(&qu

Python中的赋值,浅拷贝和深拷贝的区别

赋值 内存地址的引用,所有的改变都会同步 测试代码 #coding:utf-8 import copy a=['a','b',1,[1,2,3]] b = a #对象赋值,所有改动都会联动 a.append('d') a[0]='aaa' a[3].append(4) print a print b 运行结果 ['aaa', 'b', 1, [1, 2, 3, 4], 'd'] ['aaa', 'b', 1, [1, 2, 3, 4], 'd'] 浅拷贝 str,num等深浅拷贝都一样,list

对象复制 - 浅拷贝与深拷贝

前言 在前面的文章中,提到过Java之间如果发生了对象赋值,那么其意义是赋值的两个对象都指向同一片内存区域. 那么,如果我希望得到的是一份新的副本 - 即可以随意更改而不影响原始对象呢? 那就涉及到本文要探讨的话题 - 对象的浅拷贝与深拷贝. 浅拷贝 若对象之间发生浅拷贝,那么首先肯定的是会创建一个新的对象副本(这就不同与对象间的直接赋值). 然后所有域进行简单的直接复制 - 非对象域直接拷贝过来,对象域则拷贝此对象的地址(因为对象在java中的本质就是一个 "指针"). 如何进行浅拷

关于浅拷贝,深拷贝

浅拷贝:字符串被显示的拷贝,列表元素的引用被拷贝,因此修改例如字符串这种不可变的值,不会在被拷贝的对象中有改变. 深拷贝:字符串被显示的拷贝,列表被完全拷贝(创建了一个新对象,内容和之前的列表一致). 不管是浅拷贝还是深拷贝,被拷贝的字符串这种不可变的值一开始的id都是一样的,不管是深浅都是新建了一个对象,而不是像引用赋值那样只是多加了一个对对象的引用. 下面用id()函数来说明这种变化. >>> p = ['name', ['saving', 100]] >>> h

Python 赋值、浅拷贝和深拷贝

初学Python,和C++还是有许多不同.直接赋值.浅拷贝和深拷贝,这三种拷贝对象的操作之间还是有许多的区别.Python语言的版本为2.7,在Pycharm中进行实验. 一.直接赋值 用下面的代码来实验: 1 origin = [1, "string", [1, 3, 5]] 2 Copy = origin 3 print Copy 4 print id(origin), id(Copy) 5 Copy[0] = 5 6 print origin, Copy 7 Copy[1] =

java List复制:浅拷贝与深拷贝

Java的拷贝可以分为三种:浅拷贝(Shallow Copy).深拷贝(Deep Copy).延迟拷贝(Lazy Copy). 在java中除了基本数据类型之外(int,long,short等),还存在引用数据类型,例如String以及对象实例. 对于基本数据类型,实际上是拷贝它的值,而对于引用数据类型,拷贝的就是它的引用,并没有创建一个新的对象,即没有分配新的内存空间.这样的拷贝就称作浅拷贝. 深拷贝就是在引用类型进行拷贝时,创建了新的对象,即分配了新的内存空间给拷贝对象.下面就来具体看看浅拷

(一)Python入门-6面向对象编程:11对象的浅拷贝和深拷贝

对象的浅拷贝和深拷贝: 变量的赋值操作 只是形成两个变量,实际还是指向同一个对象. 浅拷贝 Python拷贝一般都是浅拷贝.拷贝时,对象包含的子对象内容不拷贝.因此,源对象 和拷贝对象会引用同一个子对象. 深拷贝 使用copy模块的 deepcopy 函数,递归拷贝对象中包含的子对象.源对象和拷贝对象 所有的子对象也不同. [操作] #测试对象的引用赋值,浅拷贝,深拷贝 import copy class MobilePhone: def __init__(self,cpu,screen): s

(一)Python入门-5函数:05参数的传递-可变对象-不可变对象-浅拷贝和深拷贝-不可变对象含可变子对象

一:参数的传递 函数的参数传递本质上就是:从实参到形参的赋值操作. Python中“一切皆对象”, 所有的赋值操作都是“引用的赋值”.所以,Python中参数的传递都是“引用传递”,不 是“值传递”.具体操作时分为两类: 1. 对“可变对象”进行“写操作”,直接作用于原对象本身. 2. 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填 充这块空间.(起到其他语言的“值传递”效果,但不是“值传递”) 可变对象有: 字典.列表.集合.自定义的对象等 不可变对象有: 数字.字符

JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝

前言 想写好前端,先练好内功. 栈内存与堆内存 .浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 栈 定义 后进者先出,先进者后出,简称 后进先出(LIFO),这就是典型的栈结构. 新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底. 在栈里,新元素都靠近栈顶,旧元素都接近栈底. 从栈的操作特性来看,是一种 操作受限的线性表,只允许在