1、簡單的物件複製是把乙個物件的所有值傳給另乙個物件,值型別一般沒有問題,但引用型別則存在乙份的原因,前一物件修改,後一物件的值相應也發生了變化 ,這就存在問題,無法獨立使用物件,所以需要深複製,把a類完全獨立複製給b類,a與b之間無任何關係,這時就要用的icloneable介面,兩個類都要實現icloneable介面,新增clone方法,例子如下 :
staticvoid main(string
args)
;console.writeline(bb.value+"
:"+bb.ca.value);
classb newb = bb.clone() as
classb;
console.writeline(newb.value+"
:::"+newb.ca.value);
bb.ca.value = 33
; console.writeline(bb.value+"
:"+bb.ca.value);
console.writeline(newb.value+"
:::"+newb.ca.value);}}
public
class
classa : icloneable
public
object
clone()
}public
class
classb :icloneable
public classa ca
public
object
clone()
}
注意紅色**
2、序列化
using (filestream fs = new filestream("1.txt
", filemode.create))
};xmlserializer xml = new xmlserializer(typeof
(classb));
xml.serialize(fs, a);
}
xml序列化
using (filestream fs = new filestream("3.txt
", filemode.create))
;binaryformatter formatter = new
binaryformatter();
formatter.serialize(fs, a);
}[serializable]
public class classa : icloneable
; classa b = new classa() ;
console.writeline(a.compareto(b));}}
public
class
classa : icomparable
public
int compareto(object
obj)
}
比較大小實現icomparable介面,如果比較物件相等,也可以用compareto,結果為0,則說明相等。
如果實現對物件的排序,比較大小等功能,就要對物件內實現compareto, equals和gethashcode方法,這樣就能很方便的對物件集合進行排序和比較了,如下:
class myclass : icomparablepublic string information
//////
先按照value字段值比較,如果value值一樣,
///就按照information字段值比較,
///只有兩個字段值都一樣,才認為這兩個物件相等
/// ///
///public
intcompareto(myclass other)
int result=this
.value.compareto(other.value);
if (result == 0
)
return
result;
}public
override
bool equals(object
obj)
return
this.compareto(obj as myclass)==0
; }
public
override
intgethashcode()
public
override
string
tostring()
\t information:\n
", value, information) ;}}
class
program
);myclasses.sort();
console.writeline(
"\n排序之後:");
myclasses.foreach((obj) =>);
myclass objtofind = new
myclass()
;console.writeline(
"\n查詢物件:
", objtofind);
int index =myclasses.indexof(objtofind);
console.writeline(
"物件在集合中的索引:
",objtofind,index);
console.readkey();
}
如果物件類不好修改,可以寫乙個中間類來實現比較
class mycomparer :icomparer}
淺複製 深複製 序列化
值型別的複製沒有淺複製或深複製之說。淺 深 複製針對的是引用型別。比如陣列array的clone 就是淺複製,對於值型別陣列,轉殖方法會產生兩個獨立的陣列,轉殖引用型別陣列會產生指向相同物件的兩個陣列。舉例,陣列的clone 方法,返回object型別的引用,它必須被強制轉換成陣列型別。static...
用序列化實現List 例項的深複製
如果 list裡的 t 是引用型別 如myclass類 則在 像這種寫法 listlists1 new list listlists2 new list lists1 其實是乙個淺複製的過程。如果要實現深複製,通過有幾種做法,可以用foreach,或者重寫clone 方法。但最好用和最方便的方法還是...
WPF控制項深拷貝 序列化 反序列化
今天debuglzq在做wpf拖動總結的時候,遇到了這個問題。baidu了下,貌似沒有解決這個問題的權威答案,遂寫下這篇博文。我想做的事情是 拖動乙個窗體內的控制項 rectangle 到另乙個容器控制項內,而保留原來的控制項。為了更好地把問題說清楚,請看如下 片段 void canvas1 dro...