Tip14 正確實現淺拷貝和深拷貝

Tip14 正確實現淺拷貝和深拷貝
淺拷貝:將對象中的所有字段複製到新的對象(副本)中。複製以後,若在副本中修改值類型的字段的值,不會影響到源對象對應的值,但修改引用類型的字段的值,會影響到源對象本身。
深拷貝:將對象中的所有字段複製到新的對象(副本)中。但是複製以後,對於副本的修改都不會影響到源對象本身。

拷貝建議用類型繼承ICloneable接口。例如:

    [Serializable]
    class Department
    {
        public string Name { get; set; }
        public override string ToString()
        {
            return this.Name;
        }
    }

    [Serializable]
    class Employee : ICloneable
    {
        public string IDCode { get; set; }
        public int Age { get; set; }
        public Department Department { get; set; }
        public object Clone()
        {
            //淺拷貝
            return this.MemberwiseClone();
        }

        /// <summary>
        /// 淺拷貝
        /// </summary>
        /// <returns></returns>
        public Employee ShalllowClone()
        {
            return Clone() as Employee;
        }

        /// <summary>
        /// 深拷貝
        /// </summary>
        /// <returns></returns>
        public Employee DeepClone()
        {
            //使用序列化來進行深拷貝
            using (Stream objectStream = new MemoryStream())
            {
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(objectStream, this);
                objectStream.Seek(0, SeekOrigin.Begin);
                return formatter.Deserialize(objectStream) as Employee;
            }
        }
    }

調用如下:

            Employee mike = new Employee() { IDCode = "NB123", Age = 30, Department = new Department() { Name = "Dep1" } };

            Employee rose = mike.ShalllowClone() as Employee;
            //Employee rose = mike.DeepClone() as Employee;

            Console.WriteLine(rose.IDCode);
            Console.WriteLine(rose.Age);
            Console.WriteLine(rose.Department);
            Console.WriteLine("開始改變Mike的值:");
            mike.IDCode = "NB456";
            mike.Age = 60;
            mike.Department.Name = "Dep2";
            Console.WriteLine(rose.IDCode);
            Console.WriteLine(rose.Age);
            Console.WriteLine(rose.Department);
//淺拷貝時輸出如下:
NB123
30
Dep1
開始改變Mike的值:
NB123
30
Dep2

//深拷貝時輸出如下:
NB123
30
Dep1
開始改變Mike的值:
NB123
30
Dep1

可以看到淺拷貝時,改變了源對象mike中的Department的值,副本rose的Department的值也隨之變動。而深拷貝則完全不影響。

發佈了52 篇原創文章 · 獲贊 24 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章