深度複製與淺表複製的區別在於,淺表複製只複製值型別的值,而對於例項所包含的物件依然指向原有例項。
[csharp]view plain
copy
class
program
} [serializable]
public
class
person:icloneable
public
person(
intid,
string
name, car car)
public
object clone()
//實現icloneable介面,達到淺表複製。淺表複製與深度複製無直接有關係。 對外提供乙個建立自身的淺表副本的能力
} //要複製的例項必須可序列化,包括例項引用的其它例項都必須在類定義時加[serializable]特性。
public
static
t copy(t realobject)
}
static
void
main(
string
args)
----------->name=------>car="
, p1.id, p1.name, p1.car.name);
person p2 = copy(p1); //轉殖乙個物件
person p3 = p1.clone() as
person;
//淺表複製
console.writeline("改變p1的值"
);
p1.id = 2;
p1.name = "lacy"
; p1.car.name = "紅旗"
; console.writeline("p1:id=----------->name=------>car="
, p1.id, p1.name, p1.car.name);
console.writeline("深度複製:p2:id=----------->name=------>car="
, p2.id, p2.name, p2.car.name);
console.writeline("淺表複製:p3:id=----------->name=------>car="
, p3.id, p3.name, p3.car.name);
console.readkey();
}
執行結果:
一、list物件中的t是值型別的情況(int 型別等)
對於值型別的list直接用以下方法就可以複製:
[csharp]view plain
copy
listoldlist =
newlist();
oldlist.add(..);
listnewlist = new
list(oldlist);
二、list物件中的t是引用型別的情況(例如自定義的實體類)
1、對於引用型別的list無法用以上方法進行複製,只會複製list中物件的引用,可以用以下擴充套件方法複製:
[csharp]view plain
copy
static
class
extensions
//當然前題是list中的物件要實現icloneable介面
}
2、另一種用序列化的方式對引用物件完成深拷貝,此種方法最可靠
[csharp]view plain
copy
public
static
t clone(t realobject)
}
3、利用system.xml.serialization來實現序列化與反序列化
[csharp]view plain
copy
public
static
t clone(t realobject)
}
c 淺度複製和深度複製
有時候我們需要根據乙個物件建立另外乙個相同物件,也就是所謂的複製。複製又分為淺度複製 也有叫影子複製 和深度複製。主要的差別是對於引用型別而言。淺度複製對引用型別只複製引用,及複製後源引用與目標引用的引用型別是指向都乙個物件,操作其中乙個,另外乙個也會受印像。深度複製者源引用和目標引用物件的是兩個不...
深度複製和淺度複製
深度複製和淺度複製的區別在於有沒有為拷貝出的新物件重新分配一塊記憶體區域。淺度拷貝即直接賦值,拷貝的只是原始物件的引用,在堆中仍然公用一塊記憶體,而深度拷貝為新物件在堆中重新分配一塊記憶體,所以對新物件的操作不會影響原始物件 public class person implements clonea...
複製建構函式和深度複製
如果類中包含了使用new初始化的指標成員,應當定義乙個複製建構函式,以複製指向的資料,而僅僅是指標。複製建構函式用於將乙個物件複製到新建立的物件中,因此,它用於初始化過程中 包括按值傳遞引數 而不是常規的賦值過程中。原型 class name const class name class strin...