DataTable dttemp = new DataTable();
dttemp=orderedTable;
dttemp.Rows.Clear();
由於某種原因,orderedTable
也被清除!有誰知道爲什麼會發生這種情況?爲什麼datatable.Clear,清除其他數據表呢?
DataTable dttemp = new DataTable();
dttemp=orderedTable;
dttemp.Rows.Clear();
由於某種原因,orderedTable
也被清除!有誰知道爲什麼會發生這種情況?爲什麼datatable.Clear,清除其他數據表呢?
因爲您的dttemp
現在引用orderedTable
- 它們都指向內存中的相同位置。
這行代碼:
dttemp = orderedTable;
不不做一個全面的,深刻的副本!這只是點dttemp
到同一個地方,orderedTable
生活在....
因此,如果您清除.Rows()
,那麼這些無論你在它通過dttemp
或orderedTable
lookign歷程。
如果你想要一個真實的,完整的,深拷貝,使用:
dttemp = orderedTable.Copy(); // copies structure and data
或
dttemp = orderedTable.Clone(); // copies the structure, but no data
您有兩個變量(dttemp
和orderedTable
),當您調用Clear()
時,它指向同一個對象。因此,dttemp
所指向對象的改變也是對由orderedTable
指向的對象的改變。
您new DataTable()
創建被簡單地丟棄到堆上的表(等待被垃圾收集)當您分配dttemp=orderedTable;
orderedTable只是保持到dttemp對象的引用,因此當改變dttemp要更改內存中的數據與由orderedTable引用的對象相同。
由您執行這行的時間:
dttemp = orderedTable;
這裏只有一個實際上這DataTable
是相關的。您在第一行代碼中創建的DataTable
有資格進行垃圾回收 - 沒有任何關於垃圾回收的注意事項。此處引用的行不會複製對象 - 它會複製參考,因此dttemp
和orderedTable
指的是相同的DataTable
。
DataTable
是一個參考類型。這絕對是至關重要的,您瞭解引用類型如何在C#中工作 - 否則整個語言對您而言都會產生莫名其妙的結果。我有一個article,你可能會發現這些線有用。
要將您的代碼放入上下文中,請想象一下DataTable
實際上是一個房子。你把你的家庭地址給兩個不同的人。一個去紅綠燈,然後另一個去房子。顯然他會發現它是紅色的。
重要的是,你沒有給每個人「你的房子」 - 你只是給了他們一個到你的房子的方式。這就是參考類型在C#中的工作原理。
的dttemp
的值不是DataTable
- 這是一個參考到DataTable
。通過任何其他變量對該對象所做的更改仍將通過dttemp
進行查看。
好吧,大概有2個表 - 一個來自`orderedTable`,一個來自`丟棄的DataTable()`; p – 2011-01-14 19:55:53
@Marc:True。沒有注意到這一點:) – 2011-01-14 19:57:02
dttemp=orderedTable;
該行將orderedTable
指定爲dttemp
。根據定義,dttemp
撥打電話將影響orderedTable
。
,因爲它是引用類型而不是值類型。
在C#類變量引用保存。這意味着變量本身就像是指向真實數據的指針。
所以變量(除原語)真的不保存數據,但只是指向你分配給它的數據。
在你的情況,你指向一個空表:
DataTable dttemp = new DataTable();
但你讓它指向另一個表:
dttemp=orderedTable;
這將有效地使兩件事情:
變量dttemp
現在指向的orederedTable
你在第一行創建的新表沒有人指向它......它在內存中丟失了,並且在引用它的時候會被引用,並且在垃圾收集器運行時會被定位。
dttemp = orderedTable; <===這就是爲什麼...... – 2011-01-14 19:53:10