网上说DataTable的Clone是深复制,Copy是浅复制,实际自己测试了一下发现Clone只是复制表结构,都不能算传统意义上的“复制”,而Copy更像是深复制,无论如何删减源表都没影响。本来考虑可能是DataTable内部对象是引用类型或值类型所造成的影响,但仔细想了下,内部对象应该是指DataRow数组吧,这个是引用类型才对。所以个人觉得应该是深度复制。
还有个Select方法得出来的DataRow数组,这个倒像是浅复制,我清空了表后,这个数组也被清空了。
其实是想提问题的,不过习惯性先说了自己的理解。望指点。顺便再问下浅复制和直接用“=“赋值有什么区别。感觉两者达到的结果都是一样的。
只需要去查看一下他的源码就知道了,
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; } |
看不太不懂,源码我用ILSpy看过了,一般Array的Clone方法是调用MemberWiseClone(),这个是浅复制我知道的。但是DataTable的实现就看不太懂了。
this.Clone(null)这是调用了内部定义的Clone(DataSet ds)方法吧,然后这个Clone(DataSet ds)方法又调用了内部定义的一个CloneTo()方法。这个CloneTo方法内部定义了个DataTable,然后将所有的表属性复制给这个DataTable,再返回,这相当于重新建了一个表,是深拷贝,对吗?
同理Copy方法,建一个闲的DataTable对象,先调用了Clone实现了表结构复制,再调用CopyRow方法循环插入每一行。是这个意思吗?
@林J:
你的理解是对的,简单的说Clone是浅复制,只复制表结构,Copy是深复制,复制表结构的同时数据也复制