首页 新闻 会员 周边 捐助

DataTable的Copy()方法是深度复制还是浅复制

0
悬赏园豆:20 [已解决问题] 解决于 2012-11-28 13:16

网上说DataTable的Clone是深复制,Copy是浅复制,实际自己测试了一下发现Clone只是复制表结构,都不能算传统意义上的“复制”,而Copy更像是深复制,无论如何删减源表都没影响。本来考虑可能是DataTable内部对象是引用类型或值类型所造成的影响,但仔细想了下,内部对象应该是指DataRow数组吧,这个是引用类型才对。所以个人觉得应该是深度复制。

还有个Select方法得出来的DataRow数组,这个倒像是浅复制,我清空了表后,这个数组也被清空了。

其实是想提问题的,不过习惯性先说了自己的理解。望指点。顺便再问下浅复制和直接用“=“赋值有什么区别。感觉两者达到的结果都是一样的。

林J的主页 林J | 菜鸟二级 | 园豆:202
提问于:2012-11-28 10:09
< >
分享
最佳答案
1

只需要去查看一下他的源码就知道了,

Clone只是复制表结构

public virtual DataTable Clone()
{
    return this.Clone(null);
}

 再看看Copy方法源码,你应该懂了

public DataTable Copy()
{
    DataTable table2;
    IntPtr ptr;
    Bid.ScopeEnter(out ptr, "<ds.DataTable.Copy|API> %d#\n", this.ObjectID);
    try
    {
        DataTable table = this.Clone();
        foreach (DataRow row in this.Rows)
        {
            this.CopyRow(table, row);
        }
        table2 = table;
    }
    finally
    {
        Bid.ScopeLeave(ref ptr);
    }
    return table2;
}
收获园豆:20
Rich.T | 老鸟四级 |园豆:3440 | 2012-11-28 10:24

看不太不懂,源码我用ILSpy看过了,一般Array的Clone方法是调用MemberWiseClone(),这个是浅复制我知道的。但是DataTable的实现就看不太懂了。

this.Clone(null)这是调用了内部定义的Clone(DataSet ds)方法吧,然后这个Clone(DataSet ds)方法又调用了内部定义的一个CloneTo()方法。这个CloneTo方法内部定义了个DataTable,然后将所有的表属性复制给这个DataTable,再返回,这相当于重新建了一个表,是深拷贝,对吗?
同理Copy方法,建一个闲的DataTable对象,先调用了Clone实现了表结构复制,再调用CopyRow方法循环插入每一行。是这个意思吗?
林J | 园豆:202 (菜鸟二级) | 2012-11-28 13:02

@林J: 

你的理解是对的,简单的说Clone是浅复制,只复制表结构,Copy是深复制,复制表结构的同时数据也复制

Rich.T | 园豆:3440 (老鸟四级) | 2012-11-28 13:14
其他回答(2)
0

Copy只是复制一份,Clone是复制一个结构,select出来的是列的引用

Tom.汤 | 园豆:3060 (老鸟四级) | 2012-11-28 12:19
1

Copy 和 Clone 方法创建的新 DataTable 都与原始 DataTable 具有相同的结构。 Copy 方法创建的新DataTable 与原始表具有相同的 DataRows 集,但 Clone 方法创建的新 DataTable 不包含任何DataRows

MSDN的解释

chenping2008 | 园豆:9836 (大侠五级) | 2012-11-28 13:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册