最近在写程序的时候,碰到了一个 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 
= this.tableNamespace;
    clone.tablePrefix 
= this.tablePrefix;
    clone.fNestedInDataset 
= this.fNestedInDataset;
    clone.caseSensitive 
= this.caseSensitive;
    clone.caseSensitiveAmbient 
= this.caseSensitiveAmbient;
    clone.culture 
= this.culture;
    clone.displayExpression 
= this.displayExpression;
    clone.compareInfo 
= this.compareInfo;
    clone.compareFlags 
= this.compareFlags;
    clone.typeName 
= this.typeName;
    clone.repeatableElement 
= this.repeatableElement;
    clone.MinimumCapacity 
= this.MinimumCapacity;
    DataColumnCollection columns 
= this.Columns;
    
for (int i = 0; i < columns.Count; i++)
    {
        clone.Columns.Add(columns[i].Clone());
    }
    
if (cloneDS == null)
    {
        
for (int m = 0; m < columns.Count; m++)
        {
            clone.Columns[columns[m].ColumnName].Expression 
= columns[m].Expression;
        }
    }
    
if (this.PrimaryKey.Length > 0)
    {
        
int length = this.PrimaryKey.Length;
        DataColumn[] columnArray 
= new DataColumn[length];
        
for (int n = 0; n < length; n++)
        {
            columnArray[n] 
= clone.Columns[this.PrimaryKey[n].Ordinal];
        }
        clone.PrimaryKey 
= columnArray;
    }
    
for (int j = 0; j < this.Constraints.Count; j++)
    {
        
if (!(this.Constraints[j] is ForeignKeyConstraint))
        {
            UniqueConstraint constraint 
= ((UniqueConstraint) this.Constraints[j]).Clone(clone);
            Constraint constraint2 
= clone.Constraints.FindConstraint(constraint);
            
if (constraint2 != null)
            {
                constraint2.ConstraintName 
= this.Constraints[j].ConstraintName;
            }
        }
    }
    
for (int k = 0; k < this.Constraints.Count; k++)
    {
        
if (!(this.Constraints[k] is ForeignKeyConstraint) && !clone.Constraints.Contains(this.Constraints[k].ConstraintName, true))
        {
            clone.Constraints.Add(((UniqueConstraint) 
this.Constraints[k]).Clone(clone));
        }
    }
    
if (this.extendedProperties != null)
    {
        
foreach (object obj2 in this.extendedProperties.Keys)
        {
            clone.ExtendedProperties[obj2] 
= this.extendedProperties[obj2];
        }
    }
    
return clone;
}

 

 

posted on 2007-12-14 16:42  颜昌钢  阅读(1702)  评论(0编辑  收藏  举报