有个小问题,大家一起研究。

不知道是惊喜还是郁闷  一文中,指出:
public GetDataSet1(){
    DataSet ds 
= new
 DataSet();
    
//填充一个DataSet,省略



    
return ds.Clone();
}


//获取一个深层副本
public GetDataSet2(){
    DataSet ds 
= new
 DataSet();
    
//填充一个DataSet,省略



    
return ds;
}


获取浅表副本就是把这本书直接接给读者(GetDataSet1()
获取深层副本就是把这本书留着(或者销毁),抄写一份给读者(GetDataSet2())

我觉得有些不同的看法,而且这段代码似乎有两个问题:
1、新建的实例ds是在方法GetDataSet1及GetDataSet2中的,它们的生命周期应该就在两个方法中,让它们返回本身的引用给外部,而且还是public的,允许其它类来使用,这样似乎不但会影响封装性,而且本该直接回收的对象,却产生了引用,那么它是不是会对.net的垃圾回收造成影响?个人愚见。

2、直接return ds时,给外部获取的是这个ds对象的一个引用,实际上还是同一个实例,只有使用ds.Copy()时,才会完全复制一个新的实例。ds.Clone(),但clone()不同的是真正的建立了另一个实例,并复制了外壳和静态的数据,然后其它的内部数据(包括内部实例),都不会被复制。在逻辑上,你操作时可以当作它们是两个对象来操作,但任何一个对象内部的非静态数据(注意:内部的“非静态”数据,外壳变化不发生影响)发生改变时,也会影响另一个。

3、return ds.Clone()与return ds根本就是两回事,不具可比性,dsClone返回的一个具有相同架构的DataSet,里面是没有数据的(DataRow的实例)

真实情况是这样的:DataSet 提供了CloneCopy 两种方法,以提供两种克隆级别。Clone 只复制 DataSet 的结构,即表、关系和约束;而 Copy 则同时克隆架构和数据,对 DataSet 的内容进行真正的深复制。所以,在理论上Clone应该会比直接return更消耗时间。


注:第1点,有异议性,那是我个人理解,并没有真正的验证过。

原文地址:https://www.cnblogs.com/William_Fire/p/32880.html