也许会有人这样解释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#的深拷贝和浅拷贝的更多相关文章

  1. C#设计模式:原型模式(Prototype)及深拷贝、浅拷贝

    原型模式(Prototype) 定义: 原型模式:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.被复制的实例被称为原型,这个原型是可定制的. Prototype Pattern也是一 ...

  2. Objective-C中的深拷贝和浅拷贝

    在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...

  3. $.extend()的深拷贝和浅拷贝详细讲解

    版权声明:作者原创,转载请注明出处! 语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 描述: 将两个或更多对象的内容合并到第一个对象 ...

  4. JavaScript中面向对象的的深拷贝和浅拷贝

    理解深拷贝和浅拷贝之前需要弄懂一些基础概念,内存中存储的变量类型分为值类型和引用类型. 1.值类型赋值的存储特点, 将变量内的数据全部拷贝一份, 存储给新的变量. 例如:var num = 123 : ...

  5. C++深拷贝与浅拷贝

    当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用.也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用.以下情况都会调用拷贝构造函数: (1)一个对 ...

  6. C++的深拷贝与浅拷贝

    对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面是一个类对象拷贝的简单例子. #i ...

  7. Python赋值语句与深拷贝、浅拷贝的区别

    参考:http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-d ...

  8. [C#进阶系列]专题一:深入解析深拷贝和浅拷贝

    一.前言 这个星期参加了一个面试,面试中问到深浅拷贝的区别,然后我就简单了讲述了它们的之间的区别,然后面试官又继续问,如何实现一个深拷贝呢?当时只回答回答了一种方式,就是使用反射,然后面试官提示还可以 ...

  9. 也来玩玩 javascript对象深拷贝,浅拷贝

    经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One method of copying an object is ...

  10. OC中的深拷贝与浅拷贝

    深拷贝(deep copy)与浅拷贝(shallow copy)的定义一直是有争论的. 一种理解是: 所谓的浅拷贝, 就是不完全的拷贝 NSString *s = @"123"; ...

随机推荐

  1. array与xml转换实现(转)

    <?php function xml_encode($data, $charset = 'utf-8', $root = 'so') { $xml = '<?xml version=&qu ...

  2. 动手实现react Modal组件

    Modal组件 长话不多说,接下来让我们来动手实现一个react Modal组件. 我们先来看一下实际效果 Modal的布局 首先,让我们先思考下一个Modal组件的布局是怎么样的. 我们先拿一个基本 ...

  3. pip解决超时问题(timeout)

    我们下载python的库一般会使用pip工具.但在下载的过程中经常会timeout,这是因为资源在国外,我们国内某些资源下载速度特别慢,主要有两种方法解决. 一.设置pip timeout超时时间 创 ...

  4. FLV 封装格式解析

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10662941.html FLV (Flash Video) 是由 Adobe 公司推出的 ...

  5. git commit之后,想撤销commit

    原文 写完代码后,我们一般这样 git add . //添加所有文件 git commit -m "本功能全部完成" 执行完commit后,想撤回commit,怎么办? 这样凉拌: ...

  6. .net core Identity集成IdentityServer(2) 实现IprofileService接口在accesstoken中增加自定义claims

    导读 1. 如何添加自定义的claims. 前请提要 目前我们拥有了三个web应用. localhost:40010, 验证服务器 localhost:40011, mvc客户端, 充当webapp请 ...

  7. 导入本地的oracle数据库文件

    1. 创建表空间 create tablespace charge_zang datafile 'F:\app\zang\oradata\orcl\charge_zang.dbf' size 50M ...

  8. SignalR的简单实现消息广播

    之前由于一个项目的需要(简单说一下,一个网页游戏,裁判的页面点击开始按钮,玩家便可以开始游戏),研究了很久,最终一个同事跟我推荐了SignalR.距离项目结束已经有一段时间了,再来回顾一下Signal ...

  9. 【Java深入研究】1、object类

    一.概述Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 参考英文:* Class {@code Object} is the ro ...

  10. That Nice Euler Circuit(LA3263+几何)

    That Nice Euler Circuit Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu D ...