c 深拷貝幫助類

2021-08-15 06:39:58 字數 3078 閱讀 9652

using system;

using system.collections.generic;

using system.io;

using system.linq;

using system.linq.expressions;

using system.reflection;

using system.runtime.serialization;

using system.runtime.serialization.formatters.binary;

using system.text;

using system.threading.tasks;

using system.xml.serialization;

namespace deepcopy

return (t)convert.changetype(copied, obj.gettype());

}object retval = activator.createinstance(obj.gettype());

propertyinfo properties = obj.gettype().getproperties(

bindingflags.public | bindingflags.nonpublic

| bindingflags.instance | bindingflags.static);

foreach (var property in properties)

return (t)retval;

}public static t deepcopywithreflection_second(t obj)

return (t)convert.changetype(copied, obj.gettype());

}// 對於類型別開始記錄物件反射的次數

int reflectioncount = add(typereflectioncountdic, obj.gettype());

if (reflectioncount > 1)

return obj;

object retval = activator.createinstance(obj.gettype());

propertyinfo properties = obj.gettype().getproperties(

bindingflags.public | bindingflags.nonpublic

| bindingflags.instance | bindingflags.static);

foreach (var property in properties)

return (t)retval;

}public static t deepcopywithreflection_third(t obj)

return (t)convert.changetype(copied, obj.gettype());

}int reflectioncount = add(typereflectioncountdic, obj.gettype());

if (reflectioncount > 1 && obj.gettype() == typeof(deepcopydemoclass))

return (t)deepcopydemoclasstyperef; // 返回deepcopyclassb物件

object retval = activator.createinstance(obj.gettype());

if(retval.gettype() == typeof(deepcopydemoclass))

deepcopydemoclasstyperef = retval; // 儲存一開始建立的deepcopydemoclass物件

propertyinfo properties = obj.gettype().getproperties(

bindingflags.public | bindingflags.nonpublic

| bindingflags.instance | bindingflags.static);

foreach (var property in properties)

return (t)retval;

}private static t setarrayobject(t arrayobj)

return (t)convert.changetype(copied, arrayobj.gettype());

}private static int add(dictionarydict, type key)

dict[key] += 1;

return dict[key];

}// 利用xml序列化和反序列化實現

public static t deepcopywithxmlserializer(t obj)

return (t)retval;

}// 利用二進位制序列化和反序列實現

public static t deepcopywithbinaryserialize(t obj)

return (t)retval;

}// 利用datacontractserializer序列化和反序列化實現

public static t deepcopy(t obj)

return (t)retval;

}// 表示式樹實現

// ....

public static class tran***pv2

memberinitexpression memberinitexpression = expression.memberinit(expression.new(typeof(tout)), memberbindinglist.toarray());

expression> lambda = expression.lambda>(memberinitexpression, new parameterexpression );

return lambda.compile();

}public static tout trans(tin tin)}}

}

C 淺拷貝和深拷貝(String類)

簡單的來說,淺拷貝 是增加了乙個指標,指向原來已經存在的記憶體。而 深拷貝 是增加了乙個指標,並新開闢了一塊空間 讓指標指向這塊新開闢的空間。淺拷貝 在多個物件指向一塊空間的時候,釋放乙個空間會導致其他物件所使用的空間也被釋放了,再次釋放便會出現錯誤 為了形象化說明什麼是深拷貝和淺拷貝,我們就先寫乙...

String類,淺拷貝,深拷貝

想要使用c 中的類那麼必須要有它的標頭檔案,include 首先來看下面乙個 這個程式很簡單,但是如果有乙個空指標呢?那麼就需要判斷了,並且用預設值把有引數的string和沒有引數的string合併在一起,那這個程式只需要做下面的改變 既然你的建構函式開闢了一段空間,那麼就需要釋放掉,此時就需要析構...

C 深拷貝與淺拷貝(實現String類)

所謂淺拷貝,指的是在物件複製時,只是對物件中的資料成員進行簡單的複製,預設拷貝建構函式執行的也是淺拷貝。簡單的說,淺拷貝就是值傳遞,將源空間裡面的內容複製到目標空間中。存在缺陷 多個指標可能共用管理一塊記憶體空間,在釋放時,導致對一塊空間的多次釋放,造成記憶體洩露。在 深拷貝 的情況下,對於物件中動...