2011-02-28 55 views
1

在我的WinForm程序(vb.net)我說:爲什麼Clear()清除兩個DataTable?

Dim dt As New DataTable 
'Get data from DB into dt 
'... 

Dim dttemp As New DataTable 
dttemp = dt 
dt.Clear() 
'... 

但是當我運行該程序,Clear()清除既dtdttemp! 爲什麼?是不是dtdttemp應該是DataTable的兩個不同的實例?

(我終於找到了一個解決方案 - dttemp = dt.Copy()代替dttemp = dt但我仍然不明白爲什麼Copy()在這種情況下是必要很抱歉,如果這是一個基本的問題 - 我是一個初學編程的。)

+0

「dttemp = dt」將您的臨時變量分配給與您的主「dt」相同的實例,因此它們都對同一個對象保持相同的引用。更有意義? – asawyer 2011-02-28 14:53:47

回答

3

這是因爲DataTable參考類型

dttempdt的值只是對同一個對象的引用。

如果我在一張紙上寫下我的地址並將它分給兩個人,那麼他們中的一個會使我(清理我的房子/ DataTable)發生故障,那麼如果第二個人訪問我,他們會發現房屋爲空。這就是這裏發生的事情。

我有一篇文章(基於C#的,但同樣適用)約reference types and value types,你可能會發現有用的。

+0

好的比喻。所以'Copy()'就等同於建造另一個房子,與第一個房子相同,但是在街上?然後攻擊者會得到兩個不同的地址。對? – kodkod 2011-02-28 16:10:23

+0

@kodkod:根本不一定在同一個地方 - 但是,是的,它會建造另一個房子,裏面裝着同樣的東西。所以如果竊賊偷走了一間房子,那麼這個房間的內容將保持不變。 – 2011-02-28 16:12:42

4

當您編寫dttemp = dt時,您將更改dttemp以指代與dt相同的DataTable實例。

它不創建實例的單獨副本。

值類型(結構)表現出您期望的方式,但引用類型(類)不表示。

0
You should do: 

Dim dt As New DataTable 
'Get data from DB into dt 
'... 

Dim dttemp As New DataTable 
dttemp = dt.Copty() 
dt.Clear() 
'... 
0

每當你做variable = New Something您正在創建類的實例,並建立一個參考指向特定實例。

因此,在您的代碼dtdttemp只是對DataTable對象的引用。

那麼你的代碼的作用是:

  1. 創建一個新的DataTable對象,並設置dt引用指向它
  2. 創建另一個DataTable對象,並設置dttemp引用指向它
  3. 設置dttemp參考指向dt正在引用(在這種情況下,第一個數據表)。這有效地孤立了第二個數據表,並使其有資格進行垃圾回收。

所以,因爲兩者dtdttemp被引用相同的對象,無論是通過一個完成後,將通過第二可見。
當您在做dt.Copy()時,您正在創建DataTable類的另一個實例,將值從第一個數據表複製到第二個數據表,然後返回第二個數據表。 這樣你就可以有兩個獨立的實例,你可以隨心所欲地進行管理。

相關問題