zoukankan      html  css  js  c++  java
  • 【C#】浅克隆和深克隆的区别和在C#中的体现形式

    前言:我们知道对象分引用类型和值类型。

    浅克隆:复制一个现有对象,引用类型指向同一个内存块(string为最特殊的对象,这里当作值类型来看先)

    public class User    
      {
            public int Age { get; set; }
            public string UserName { get; set; }
            public List<string> List { get; set; }
            public User ShallowCopy()
            {
                return this.MemberwiseClone() as User;
            }
        }
    
      class Program
        {
            static void Main(string[] args)
            {
                var user = new User();
                user.List = new List<string>();
                user.Age = 1;
                user.UserName = "lisi";
                user.List.Add("lst1");
        
    
                var cloneUser = user.ShallowCopy();
    
                Console.WriteLine(user.List.Count());
                Console.WriteLine(cloneUser.UserName);
                Console.WriteLine(user.Age);
    
                cloneUser.Age = 2;
                cloneUser.UserName = "zhangsan";
                cloneUser.List.Add("lst2");
    
    
    
                Console.WriteLine(user.List.Count());
                Console.WriteLine(cloneUser.UserName);
                Console.WriteLine(user.Age);
                Console.ReadKey();
    
            }
        }
    Shallow Copy Code

     输出值分别为:

      1(user.List.Count(),这个说引用类型,我们看下面的输出)

      lisi

      1

      2(这里我们在克隆以后,有添加一个值,我们说了他们指向同一个内存块,所以这里是2)

      zhangsan

      1

    补充:

    一个对象中的字段有的是值类型的,有的是引用类型的。对于值类型字段来说,它的值就是简单的值,而对于引用类型来说,它的值是地址。

    浅复制在复制时,将这个对象的值字段和引用字段(均为非静态字段)全部复制过去,获得了这个对象的值和地址。

    即:当其中一个对象的引用字段所指向的地址中的变量变化时,所有浅复制对象中的该引用字段都会发生变化。

    深克隆:复制一个现有对象,引用类型指向另一个内存块(改变克隆对象的任何一个值都不会影响其他值)

     public class User
        {
            public int Age { get; set; }
            public string UserName { get; set; }
            public List<string> List { get; set; }
    
    
            public User Clone()
            {
                return new User()
                 {
                     Age = this.Age,
                     UserName = this.UserName,
                     List = new List<string>() { this.List[0] }
                 };
            }
        }
     class Program
        {
            static void Main(string[] args)
            {
                var user = new User();
                user.List = new List<string>();
                user.Age = 1;
                user.UserName = "lisi";
                user.List.Add("lst1");
    
    
                var cloneUser = user.Clone();
                cloneUser.Age = 2;
                cloneUser.UserName = "zhangsan";
                cloneUser.List[0] = "updatedlist";
    
    
    
                Console.WriteLine(user.List[0]);
                Console.WriteLine(user.UserName);
                Console.WriteLine(user.Age);
                Console.ReadKey();
    
            }
        }
    View Code

     输出值为:

      lst1

      lisi

      1

    注:

    所有引用类型都是深克隆
  • 相关阅读:
    今天更新Chrome到1.0版本
    升级安装Windows7后需要处理的兼容性程序(不断更新中)
    解决IE8下无法播放rm的视频网站内容
    升级到NVelocity1.1版本
    安装VS2010中文版初体验
    【iPhone开发】说说Xcode4中xib绑定的原理
    第一个iPhone版本应用发布
    xcode4.2开发最新的ios5应用,分享snow版本下载地址
    xCode 4.X 免证书真机发布及调试
    [转]IT程序员之间薪水差距之大及对职业培训的看法
  • 原文地址:https://www.cnblogs.com/guochenkai/p/3878670.html
Copyright © 2011-2022 走看看