最近在写程序的时候,碰到了一个 DataTable.Clone() 的问题,描述如下:
程序中,需要传入一个DataTable,并且,希望返回该表中一些修改好的数据行,程序代码如下:
public DataTable ChangeTable(DataTable dtSoc,DataTable dtTemp)
{
dtTemp=dtSoc.Clone();
foreach(DataRow row in dtSco.Rows)
{
if(row["Name"]=="mingzi")
{
row["Adress"]="111";
dtTemp.importRow(row);//这个函数忘记叫么子了
}
}
return dtTemp;
}
本以为该函数能够正确的返回修改的值,实际上,返回的结果好像是null,然后,自己对DataTable的类型有点疑惑,呵呵,因为参数传的是DataTable,是一个引用类型,函数里面,对它的任一修改,都回返回。实际上,由于程序里面有了DataTable.Clone()这个方法,使得结果不如自己希望的。
DataTable.Clone(),对象的拷贝,在c#里面,有浅拷贝和深拷贝的区别,浅拷贝,只拷贝对象的数据,对对象的修改,都将影响到原对象。深拷贝,会从新分配一个地址,保存一个对象,对新对象的修改,不会影响到原有程序。
按照程序的结果,DataTable.Clone() 应该是深拷贝。
附上微软 该函数的方法:
internal
DataTable Clone(DataSet cloneDS)
{
DataTable clone = (DataTable) Activator.CreateInstance( base .GetType());
if (clone.Columns.Count > 0 )
{
clone.Reset();
}
return this .CloneTo(clone, cloneDS);
}
private DataTable CloneTo(DataTable clone, DataSet cloneDS)
{
clone.tableName = this .tableName;
clone.tableNamespace =
{
DataTable clone = (DataTable) Activator.CreateInstance( base .GetType());
if (clone.Columns.Count > 0 )
{
clone.Reset();
}
return this .CloneTo(clone, cloneDS);
}
private DataTable CloneTo(DataTable clone, DataSet cloneDS)
{
clone.tableName = this .tableName;
clone.tableNamespace =