什么是深拷貝和淺拷貝以及如何實現深拷貝


什么是淺拷貝?

淺拷貝是指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();
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM