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

    注:

    所有引用类型都是深克隆
  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/guochenkai/p/3878670.html
Copyright © 2011-2022 走看看