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一下才發現別人論述這個知識的博客都是很多年前的了,這麼老的知識點我今天才知道,慚愧呀!
有時候我(們?)總覺得自己做了很多年,對所學技術已經瞭如指掌了,深入的研究才發現,還有很多知識的盲點,
加上新技術層出不窮,精通任何一門學問都不是一件輕而易舉的事情啊。
長到老,學到老,古人不餘欺!