2011-01-14 24 views

回答

3

因爲您的dttemp現在引用orderedTable - 它們都指向內存中的相同位置。

這行代碼:

dttemp = orderedTable; 

做一個全面的,深刻的副本!這只是點dttemp到同一個地方,orderedTable生活在....

因此,如果您清除.Rows(),那麼這些無論你在它通過dttemporderedTable lookign歷程。

如果你想要一個真實的,完整的,深拷貝,使用:

dttemp = orderedTable.Copy(); // copies structure and data 

dttemp = orderedTable.Clone(); // copies the structure, but no data 
4

您有兩個變量(dttemporderedTable),當您調用Clear()時,它指向同一個對象。因此,dttemp所指向對象的改變也是對由orderedTable指向的對象的改變。

new DataTable()創建被簡單地丟棄到堆上的表(等待被垃圾收集)當您分配dttemp=orderedTable;

0

orderedTable只是保持到dttemp對象的引用,因此當改變dttemp要更改內存中的數據與由orderedTable引用的對象相同。

8

由您執行這行的時間:

dttemp = orderedTable; 

這裏只有一個實際上這DataTable是相關的。您在第一行代碼中創建的DataTable有資格進行垃圾回收 - 沒有任何關於垃圾回收的注意事項。此處引用的行不會複製對象 - 它會複製參考,因此dttemporderedTable指的是相同的DataTable

DataTable是一個參考類型。這絕對是至關重要的,您瞭解引用類型如何在C#中工作 - 否則整個語言對您而言都會產生莫名其妙的結果。我有一個article,你可能會發現這些線有用。

要將您的代碼放入上下文中,請想象一下DataTable實際上是一個房子。你把你的家庭地址給兩個不同的人。一個去紅綠燈,然後另一個去房子。顯然他會發現它是紅色的。

重要的是,你沒有給每個人「你的房子」 - 你只是給了他們一個到你的房子的方式。這就是參考類型在C#中的工作原理。

dttemp的值不是DataTable - 這是一個參考DataTable。通過任何其他變量對該對象所做的更改仍將通過dttemp進行查看。

+0

好吧,大概有2個表 - 一個來自`orderedTable`,一個來自`丟棄的DataTable()`; p – 2011-01-14 19:55:53

+0

@Marc:True。沒有注意到這一點:) – 2011-01-14 19:57:02

0
dttemp=orderedTable; 

該行將orderedTable指定爲dttemp。根據定義,dttemp撥打電話將影響orderedTable

0

,因爲它是引用類型而不是值類型。

0

在C#類變量引用保存。這意味着變量本身就像是指向真實數據的指針。

所以變量(除原語)真的不保存數據,但只是指向你分配給它的數據。

在你的情況,你指向一個空表:

DataTable dttemp = new DataTable(); 

但你讓它指向另一個表:

dttemp=orderedTable; 

這將有效地使兩件事情:

  1. 變量dttemp現在指向的orederedTable

  2. 你在第一行創建的新表沒有人指向它......它在內存中丟失了,並且在引用它的時候會被引用,並且在垃圾收集器運行時會被定位。

相關問題