zoukankan      html  css  js  c++  java
  • C#中的深拷贝与浅拷贝

    什么是深拷贝(deep cooy)、浅拷贝(shallow copy)?

    深拷贝:不仅会复制对象的引用,还会复制引用的值。复制后得到一个完全独立的对象,修改这个对象对另一个对象没有影响

    浅拷贝:只会复制对象的引用。复制后,两个对象的引用指向的是同一个值,一个对象的修改会影响到另一个对象

    值类型只能进行深拷贝,引用类型可以进行深拷贝与浅拷贝。

    如下所示:

    值类型:

    int source = 123;
    // 值类型赋值内部执行深拷贝
    int copy = source;
    // 对拷贝对象进行赋值不会改变源对象的值
    copy = 234;
    // 同样对源对象赋值也不会改变拷贝对象的值
    source = 345;

    引用类型的浅拷贝:

        public class Person
        {
            public string Name { get; set; }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Person sourceP = new Person() { Name = "张三" };
                Person copyP = sourceP; // 浅拷贝
                copyP.Name = "张老三"; // 拷贝对象改变Name值
                // 结果都是"张老三",因为实现的是浅拷贝,一个对象的改变都会影响到另一个对象
                Console.WriteLine("Person.Name: [SourceP: {0}] [CopyP:{1}]", sourceP.Name, copyP.Name);
                Console.Read();
            }
        }

    那么,如何进行应用类型的深拷贝呢??

    引用类型深拷贝的实现有反射、反序列化等集中方式,在此不进行演示。

    最后,强调一个之前遇到的比较诡异的问题,就是JS中对象进行深拷贝,只会对最外层的对象深拷贝,对象内的对象只会进行浅拷贝!

    例如有如下JS对象:  

    {Student:name:"tom",age:18,subjects:{name:"english",content:""}}

    此时,只会对Student进行深拷贝,subjects对象仍然是浅拷贝。这一点非常值得注意,容易在程序中引起意想不到的错误!

  • 相关阅读:
    C# Stream篇(—) -- Stream基类-----转载
    C# Stream篇(三) -- TextWriter 和 StreamWriter---转载
    C#文件过滤器filter---转载
    微信列表展示与详情页
    关于微信表单添加与图片上传
    登录的php代码 接口开发
    文章列表与点赞的一些功能实现 以及详情页点赞、取消赞操作
    Linux 简单命令总结
    微信小程序实现登录功能 (第一种模式)
    201509-1 数列分段 Java
  • 原文地址:https://www.cnblogs.com/qianlang/p/13520851.html
Copyright © 2011-2022 走看看