C#中"淺複製"與"深複製"的區別

1)淺複製:複製對象的所有字段,值類型字段複製其值,引用類型字段複製其引用。

可以通過this.MemberwiseClone()實現淺複製。

2)深複製:複製對象的所有字段,值類型字段複製其值,引用類型字段複製其引用的對象,如果有多級級引用,則複製所有級的對象。

幸好C#的序列化方法可以自動實現這個功能,我們可以藉助Serialize()和DSerialize()實現對象的"深度複製".

"深複製"和"淺複製"的區別可以通過這個小程序表現出來:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace ConsoleApplication9
{
    [Serializable]
    class DemoClass
    {
        public int i = 0;
        public int[] iArr = { 1, 2, 3 };

        public DemoClass Clone1() //淺clone
        {
            return this.MemberwiseClone() as DemoClass;
        }

        public DemoClass Clone2() //深clone
        {
            MemoryStream stream = new MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, this);
            stream.Position = 0;
            return formatter.Deserialize(stream) as DemoClass;
        }

    
    }


    class Program
    {
        static void Main(string[] args)
        {
            DemoClass a = new DemoClass();
            a.i = 10;
            a.iArr = new int[] { 8, 9, 10 };
            DemoClass b = a.Clone1();
            DemoClass c = a.Clone2();
                     
            a.iArr[0] = 88;  // 更改 a 對象的iArr[0], 導致 b 對象的iArr[0]發生了變化,而 c不會變化

            Console.WriteLine("clone1");
            Console.WriteLine(b.i);
            foreach (var item in b.iArr)
            {
                Console.WriteLine(item);
            }

            Console.WriteLine("Clone2");
            Console.WriteLine(c.i);
            foreach (var item in c.iArr)
            {
                Console.WriteLine(item);
            }

            Console.ReadLine();

        }
    }
}


PS:這是我今天面試時遇到的題目,bing一下才發現別人論述這個知識的博客都是很多年前的了,這麼老的知識點我今天才知道,慚愧呀!

有時候我(們?)總覺得自己做了很多年,對所學技術已經瞭如指掌了,深入的研究才發現,還有很多知識的盲點,

加上新技術層出不窮,精通任何一門學問都不是一件輕而易舉的事情啊。

長到老,學到老,古人不餘欺!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章