不知道是惊喜还是郁闷
Posted on 2004-08-12 08:13 浪淘沙 阅读(1749) 评论(9)
9月份就要辞职和MM一起读研究生了,重新过上清贫的生活,工作三年的确感触颇深,一定要用这三年的时间把自己的英语和基础知识补上,不虚此行。
2月份考完试顺势翻译的关于URL Rewriting的资料,一直都不敢贴上来,看得太多翻译糟糕和被骂的口水话,不过还是硬着头皮和xPilot申请一个公用Blog,壮壮胆贴了出来,居然被收藏了N多,感觉颇有成就感!:)hoho,好像有点自大了?还是应该谦虚一下吧......
现在对Blog得出一个结论,这是一个共同分享和抒发自己内心所想之事(人、物、Code等),就好好用吧!
昨天晚上看了一小会儿《C#类库设计手册》发现自己真的缺乏很多基础性的知识。
这次理解了浅表副本和深层副本的区别,的确有些代码看似没错,但是稍加改动就能提高一些性能了,如:
//获取一个浅表副本
public GetDataSet1(){
DataSet ds = new DataSet();
//填充一个DataSet,省略
return ds.Clone();
}
//获取一个深层副本
public GetDataSet2(){
DataSet ds = new DataSet();
//填充一个DataSet,省略
return ds;
}
假如ds
是一本书,GetDataSet()
是借书的操作,那么看看这两个区别:
获取浅表副本就是把这本书直接接给读者(GetDataSet1()
)
获取深层副本就是把这本书留着(或者销毁),抄写一份给读者(GetDataSet2()
)
我想直接把书借给读者总比抄给读者性能要高吧。系统再快也有这些细微的性能上的差异,以后要注意了
中国女足0:8输给德国,真是哭笑不得.
评论
1楼
2004-08-12 09:20 by 飞刀
楼主不会就是CSDN上那个买了房,又考上研究生的那个兄弟吧,哈哈。
2楼
2004-08-12 09:30 by cyc
读书就有时间blog,研究东西了,虽然清贫,我也想blog,已经在csdn上申请了一个,等完了发布系统,就开动吧.想写些ORM和模式的东西,因为这段时间都在看这方面的书.还有就是想要用NHibernate做一个项目试试.
3楼
2004-08-12 09:53 by Xpoint
public GetDataSet2(){
DataSet ds = new DataSet();
//填充一个DataSet,省略
return ds;
}
//--------------------------------------
public DataSet GetDataSet2()
{
DataSet ds = new DataSet();
//填充一个DataSet,省略
return ds
}
4楼
2004-08-12 10:47 by janssen
??
5楼
2004-08-12 13:40 by =I.D=Michael
就是说 return ds.Clone(); 快点?
6楼
2004-08-12 22:38 by 寒枫天伤
有误!
请参看:
http://www.cnblogs.com/William_Fire/archive/2004/08/12/32880.aspx
7楼
2004-08-13 11:27 by 浪淘沙.xp
有MM陪着读研还"清贫"阿:),年把以后,出来搞搞兼职,前途无限阿!
8楼
2004-08-13 13:17 by janssen
它的Clone()
实际上是使用内部的MemberwiseClone()
,所以我认为克隆得到的新对象实际上和原对象引用相同的地址,也就是浅表副本。而return ds
是重新实例化了一个ds
所以是深表副本。
9楼
2004-08-28 15:22 by 浪淘沙
http://www.cnblogs.com/william_fire/archive/2004/08/12/32880.aspx
看了这片文章对我这篇小随的讨论,觉得好像和我本来的想法不同了。
呵呵,我的本意是考虑一本书的传阅的问题,没想到代码使用上可能出现的问题看起来好像走茬了一本书我借来了,经过一番审查(GetDataSet方法),经过一番过滤和审查,认为达到我的下一级阅读者(调用GetDataSet方法的对象)阅读要求,决定放行。
这时候我是直接把这本书重新抄写一份给下一级阅读者然后将“原著”销毁掉方便呢?还是抄写一份目录给下一级阅读者让他直接照着目录来看我这本“原著”好?
我认为是抄写目录好,而不是整书抄写一份给下一个阅读者。
在有人阅读我的“原著”时,GC发现有相应的引用则暂缓销毁;
所有人阅读完毕我的“原著”后,GC发现没有相应的引用了,便开始进行销毁操作;当然这种直接引用的方法在“阅读”时倒是没什么,但是在“批注”时就要多考虑一些问题了,当有人打算修改我的“原著”的话是让他自己抄写一份去修改还是直接修改“原著”,然后然所有人都看到修改后的原著?
re: 不知道是惊喜还是郁闷
读书就有时间blog,研究东西了,虽然清贫,我也想blog,已经在csdn上申请了一个,等完了发布系统,就开动吧.想写些ORM和模式的东西,因为这段时间都在看这方面的书.还有就是想要用NHibernate做一个项目试试.
不知道是惊喜还是郁闷 一文中,指出: ........ 获取浅表副本就是把这本书直接接给读者(GetDataSet1()) 获取深层副本就是把这本书留着(或者销毁),抄写一份给读者(GetDataSet2())
我觉得有些不同的看法,而且这段代码似乎有两个问题: 1、新建的实例ds是在方法GetDataSet1及GetDataSet2中的,它们的生命周期应该就在两个方法中,让它们返回本身的引用给外部,而且还是public的,允许其它类来使用,这样似乎不但会影响封装性,而且本该直接回收的对象,却产生了引用,那么它是不是会对.net的垃圾回收造成影响?个人愚见。
2、直接return ds时,给外部获取的是这个ds对象的一个引用,实际上还是同一个实例,只有使用ds.Copy()时,才会完全复制一个新的实例。ds.Clone(),但clone()不同的是真正的建立了另一个实例,并复制了外壳和静态的数据,然后其它的内部数据(包括内部实例),都不会被复制。在逻辑上,你操作时可以当作它们是两个对象来操作,但任何一个对象内部的非静态数据(注意:内部的“非静态”数据,外壳变化不发生影响)发生改变时,也会影响另一个。
真实情况是这样的:DataSet 提供了Clone 和 Copy 两种方法,以提供两种克隆级别。Clone 只复制 DataSet 的结构,即表、关系和约束;而 Copy 则同时克隆架构和数据,对 DataSet 的内容进行真正的深复制。所以,在理论上Clone应该会比直接return更消耗时间。
注:第1点,有异议性,那是我个人理解,并没有真正的验证过。
Feedback
re: 有个小问题,大家一起研究。
2004-08-13 08:20 by 不至于
偶也认为 你说的是对的
re: 有个小问题,大家一起研究。
2004-08-13 08:41 by Ninputer
我觉得浅表副本就是将这本书的目录抄写一遍交给对方
深层副本就是将这本书完全抄写一本,再把这本书引用的所有文献也全都抄写一遍然后一起给对方。