什么是深拷贝和浅拷贝以及如何实现深拷贝

时间:2022-10-15 19:33:59

什么是浅拷贝?

浅拷贝是指copy的对象和被copy的对象它们公用一个实体,也就是同时指向内存中的一个相同的地址。比如,有的地方把太阳叫“太阳”,而有的地方把太阳叫做“日头”,不管是“太阳”还是“日头”,指的都是太阳这个物体,如果某天“太阳”缺了一块儿(只说如果),那么“日头”也肯定会缺一块儿,因为它们是指的是同一物体,只是称呼不同。

 

 什么是深拷贝?

深拷贝是指copy的对象和被copy的对象两个都是独立的、互不影响的。就像玩具厂生产出来的玩具,它们是一模一样的,都可以被买走,但是又是谁也不影响谁。

 

* 一般来讲,值类型的copy都属于深拷贝,而引用类型copy都属于浅拷贝(string类型除外)。

 

如何实现深拷贝?

克隆的方法网上有很多,就不多说了。这里给大家推荐一种非常简单、易懂而且安全实用的方法来实现深拷贝,欢迎大家指出不足^_^

 

 

 public class User
    {
        string name;

        public string Name  //姓名
        {
            get { return name; }
            set { name = value; }
        }

        int age;

        public int Age    //年龄
        {
            get { return age; }
            set { age = value; }
        }

        bool gender;

        public bool Gender   //性别
        {
            get { return gender; }
            set { gender = value; }
        }


        public User Copy(User user)  //深拷贝方法
        {
            //创建一个新的User对象
            User newUser = new User();

            //将你要Copy的User对象的所有属性赋值给新建的User对象
            newUser.Name = user.Name;
            newUser.Age = user.Age;
            newUser.Gender = user.Gender;

            //将赋值后的User对象return,这样你就得到了一个和你要Copy的User对象一模一样的新的User对象
            return newUser;
        }
    }

 

     

测试代码:

 class Program
    {
        static void Main(string[] args)
        {
            //创建一个名为张三的User对象
            User user = new User();
            user.Age = 18;
            user.Name = "张三";
            user.Gender = false;



            //将张三这个User对象Copy给newUser
            User newUser = user.Copy(user);



            //改变张三这个对象的各个属性
            user.Name = "李四";
            user.Age = 20;
            user.Gender = true;



            //输出张三的信息
            Console.WriteLine(user.Name);
            Console.WriteLine(user.Age);
            Console.WriteLine(user.Gender);

            Console.WriteLine();



            //输出newUser的信息
            Console.WriteLine(newUser.Name);
            Console.WriteLine(newUser.Age);
            Console.WriteLine(newUser.Gender);

            Console.ReadLine();
        }
    }