DataTable.Clone() 的問題

來源:互聯網
上載者:User

最近在寫程式的時候,碰到了一個 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;
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.