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