码迷,mamicode.com
首页 > 其他好文 > 详细

[C#]浅克隆和深克隆的区别和在C#中的体现形式

时间:2014-07-30 20:12:14      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   art   ar   div   

 

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

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

bubuko.com,布布扣
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

 

补充:

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

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

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

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

 

bubuko.com,布布扣
 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

 

注:

所有引用类型都是深克隆

 

[C#]浅克隆和深克隆的区别和在C#中的体现形式,布布扣,bubuko.com

[C#]浅克隆和深克隆的区别和在C#中的体现形式

标签:style   blog   http   color   os   art   ar   div   

原文地址:http://www.cnblogs.com/guochenkai/p/3878670.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!