C#中Clone一個對象的值到另一個對象

我也只是略懂皮毛,自己記錄下方便以後看的,各位有任何高見煩請留言,謝謝,抱拳!

想只複製值需要你的類實現ICloneable接口,並實現public object Clone()方法,其中
{
return this as object; //引用同一個對象
return this.MemberwiseClone(); //淺複製
return new DrawBase() as object;//深複製
}

  1. 引用
    即相當於用等號(=)賦值,相當於 this,引用,兩者共用一套數據
  2. 深複製
    新建對象,需手動賦值,所有數據新建,兩個對象完全無關
  3. 淺複製
    只複製值而不要引用,但只作用於基礎類型(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。

歡迎留言指教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章