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


    不知道是惊喜还是郁闷  一文中,指出:
    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点,有异议性,那是我个人理解,并没有真正的验证过。

  • 相关阅读:
    类对象成员函数的const增强zz
    希腊与罗马神话神名对照
    c++程序调用c函数 and otherwise zz
    百度相信中国电子书下载
    VolatileCorrectness,让编译器帮你检测竞争条件 zz
    高效计算一个bytes有几个byte是1?
    实现mybatis官网入门实例
    Windows Phone 深度探索(一) 带有(伪)元素加载动画的Panel (SlideInPanel)
    You have asked for this, it is basically your fault!
    New EC2 Instance Types of re:Invent 2021
  • 原文地址:https://www.cnblogs.com/William_Fire/p/32880.html
Copyright © 2020-2023  润新知