淺拷貝是指當對象的字段值被拷貝時,字段引用的對象不會被拷貝。例如,若是一個對象有一個指向字符串的字段,而且咱們對該對象作了一個淺拷貝,那麼這兩個對象將引用同一個字符串,而深拷貝是對對象實例中字段引用的對象也進行拷貝,若是一個對象有一個指向字符串的字段,而且咱們對該對象進行了深拷貝的話,那麼咱們將建立一個對象和一個新的字符串,新的對象將引用新的字符串。也就是說,執行深拷貝建立的新對象和原來對象不會共享任何東西,改變一個對象對另一個對象沒有任何影響,而執行淺拷貝建立的新對象與原來對象共享成員,改變一個對象,另一個對象的成員也會改變。其實原型模式就是淺拷貝的一個應用。ide
///火影忍者中鳴人的影分身和孫悟空的的變都是原型模式 class Client { static void Main(string[] args) { // 孫悟空 原型 MonkeyKingPrototype prototypeMonkeyKing = new ConcretePrototype("MonkeyKing"); // 變一個 MonkeyKingPrototype cloneMonkeyKing = prototypeMonkeyKing.Clone() as ConcretePrototype; Console.WriteLine("Cloned1:\t"+cloneMonkeyKing.Id); // 變兩個 MonkeyKingPrototype cloneMonkeyKing2 = prototypeMonkeyKing.Clone() as ConcretePrototype; Console.WriteLine("Cloned2:\t" + cloneMonkeyKing2.Id); Console.ReadLine(); } } /// <summary> /// 孫悟空原型 /// </summary> public abstract class MonkeyKingPrototype { public string Id { get; set; } public MonkeyKingPrototype(string id) { this.Id = id; } // 克隆方法,即孫大聖說「變」 public abstract MonkeyKingPrototype Clone(); } /// <summary> /// 建立具體原型 /// </summary> public class ConcretePrototype : MonkeyKingPrototype { public ConcretePrototype(string id) : base(id) { } /// <summary> /// 淺拷貝 /// </summary> /// <returns></returns> public override MonkeyKingPrototype Clone() { // 調用MemberwiseClone方法實現的是淺拷貝,另外還有深拷貝 return (MonkeyKingPrototype)this.MemberwiseClone(); } }