我也只是略懂皮毛,自己記錄下方便以後看的,各位有任何高見煩請留言,謝謝,抱拳!
想只複製值需要你的類實現ICloneable接口,並實現public object Clone()方法,其中
{
return this as object; //引用同一個對象
return this.MemberwiseClone(); //淺複製
return new DrawBase() as object;//深複製
}
- 引用
即相當於用等號(=)賦值,相當於 this,引用,兩者共用一套數據 - 深複製
新建對象,需手動賦值,所有數據新建,兩個對象完全無關 - 淺複製
只複製值而不要引用,但只作用於基礎類型(int,float,string也好使),對於引用類型(如自建類)不生效。如果只想要值,可在自建類裏也是用這種辦法,如a.t = T.Clone() as T; 最後將a返回,即可解決這個問題。
本次主談淺複製,如有形如:
class a : ICloneable
{
public int i;
public string str;
public b ins;
public object Clone()
{
return this.MemberwiseClone(); //淺複製
}
}
class b
{
public int bi;
}
--------------Program--------------
Main :
{
a t1 = new a();
t1.i = 1;
t1.str = "str1";
t1.ins = new t1();
t1.ins.bi = 111;
a t2 = t1.Clone() as a;
print(t1.i + " " + t2.i);
print(t1.str + " " + t2.str );
print(t1.ins.bi + " " + t2.ins.bi);
t2.i = 2;
t2.str = "str2";
t2.ins.bi = 222;
print(t1.i + " " + t2.i);
print(t1.str + " " + t2.str );
print(t1.ins.bi + " " + t2.ins.bi);
}
首先這段代碼實際上是不會運行的,因爲淺複製不會複製引用,也就是在print(t2.ins.bi)時,實際上t2.ins是空,但t2.i和t2.str是有值的,而且在後續對t2.i和t2.str進行改動時並不會影響到t1的值,這一部分的結果使我們想要的。
但實際上類裏有屬性是引用是難以避免甚至是很常見的,這種情況我們只需要在類b中也實現ICloneable接口並實現
public object Clone()
{
return this.MemberwiseClone(); //淺複製
}
同時修改類a中的Clone方法爲:
public object Clone()
{
a T = this.MemberwiseClone() as a; //淺複製
T.ins = ins.Clone() as b;
return T;
}
由此,t2將獲取到t1的所有值,且對t2修改時,並不會影響到t1。
歡迎留言指教