深複製 序列化 比較

2022-05-14 12:36:43 字數 2895 閱讀 6126

1、簡單的物件複製是把乙個物件的所有值傳給另乙個物件,值型別一般沒有問題,但引用型別則存在乙份的原因,前一物件修改,後一物件的值相應也發生了變化 ,這就存在問題,無法獨立使用物件,所以需要深複製,把a類完全獨立複製給b類,a與b之間無任何關係,這時就要用的icloneable介面,兩個類都要實現icloneable介面,新增clone方法,例子如下 :

static

void 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 : icomparable

public 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...