程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#設計模式之原型設計模式(Prototype)(4)

C#設計模式之原型設計模式(Prototype)(4)

編輯:關於C語言

五、淺拷貝與深拷貝

下面給出淺拷貝與深拷貝的兩個例子,例子使用了ICloneable接口。C#中的數組是引用型的變量,我們通過數組來進行演示:

淺拷貝:

using System;
class ShallowCopy : ICloneable
{
 public int[] v = {1,2,3};
 public Object Clone()
 {
  return this.MemberwiseClone();
 }
 public void Display()
 {
  foreach(int i in v)
   Console.Write( i + ", ");
  Console.WriteLine();
 }
}
class ClIEnt
{
 public static void Main()
 {
  ShallowCopy sc1 = new ShallowCopy();
  ShallowCopy sc2 = (ShallowCopy)sc1.Clone();
  sc1.v[0] = 9;
  sc1.Display();
  sc2.Display();
 }
}

ShallowCopy對象實現了一個淺拷貝,因此當對sc1進行克隆時,其字段v並沒有克隆,這導致sc1與sc2的字段v都指向了同一個v,因此,當修改了sc1的v[0]後,sc2的v[0]也發生了變化。

深拷貝:

using System;
class DeepCopy : ICloneable
{
 public int[] v = {1,2,3};
 // 默認構造函數
 public DeepCopy()
 {
 }
 // 供Clone方法調用的私有構造函數
 private DeepCopy(int[] v)
 {
  this.v = (int[])v.Clone();
 }
 public Object Clone()
 {
  // 構造一個新的DeepCopy對象,構造參數為
  // 原有對象中使用的 v
  return new DeepCopy(this.v);
 }
 public void Display()
 {
  foreach(int i in v)
   Console.Write( i + ", ");
  Console.WriteLine();
 }
}
class ClIEnt
{
 public static void Main()
 {
  DeepCopy dc1 = new DeepCopy();
  DeepCopy dc2 = (DeepCopy)dc1.Clone();
  dc1.v[0] = 9;
  dc1.Display();
  dc2.Display();
 }
}

這次在克隆的時候,不但克隆對象本身,連裡面的數組字段一並克隆。因此,最終打印出來的dc1與dc2不同。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved