有个小问题,大家一起研究。
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 提供了Clone 和 Copy 兩種方法,以提供兩種克隆級別。Clone 只復制 DataSet 的結構,即表、關系和約束;而 Copy 則同時克隆架構和數據,對 DataSet 的內容進行真正的深復制。所以,在理論上Clone應該會比直接return更消耗時間。
注:第1點,有異議性,那是我個人理解,并沒有真正的驗證過。
轉載于:https://www.cnblogs.com/William_Fire/archive/2004/08/12/32880.html
總結
以上是生活随笔為你收集整理的有个小问题,大家一起研究。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: exchange server 2003
- 下一篇: [新功能]定制Blog页面导航区中的链接