DataTable dttemp = new DataTable();
dttemp=orderedTable;
dttemp.Rows.Clear();
由于某种原因,orderedTable
也被清除了!有谁知道为什么会这样?
答案 0 :(得分:8)
当你执行这一行时:
dttemp = orderedTable;
实际上只有一个DataTable
是相关的。您在第一行代码中创建的DataTable
符合垃圾回收条件 - 没有任何注意事项。此处引用的行不会复制对象 - 它会复制引用,以便dttemp
和orderedTable
引用到同一个DataTable
。
DataTable
是参考类型。您完全理解至关重要,了解引用类型在C#中的工作原理 - 否则整个语言将为您带来令人困惑的结果。我有一个article,您可能会发现这些行很有用。
要将代码置于上下文中,假设DataTable
实际上是一个房子。您将家庭住址提供给两个不同的人。一个人去把房子涂成红色......然后另一个人去看房子。显然他会发现它是红色的。
重要的是你没有给每个人“你的房子” - 你只是给了他们一个到达你家的方式。这就是引用类型在C#中的工作方式。
dttemp
的值不是DataTable
- 它是DataTable
的引用。通过dttemp
仍可以看到通过任何其他变量对该对象所做的更改。
答案 1 :(得分:4)
您有两个变量(dttemp
和orderedTable
),在您调用Clear()
时,它们指向同一个对象。因此,dttemp
指向的对象的更改也是对orderedTable
指向的对象的更改。
当您分配new DataTable()
dttemp=orderedTable;
创建的表只会被丢弃到堆上(等待垃圾回收)
答案 2 :(得分:3)
由于您的dttemp
现在引用orderedTable
- 它们都指向内存中的相同位置。
这行代码:
dttemp = orderedTable;
不执行完整,深层复制!它只是将dttemp
指向orderedTable
所居住的同一个地方......
因此,如果您清除.Rows()
,那么无论您是通过dttemp
还是orderedTable
进行查看,这些内容都会消失。
如果你想要一个真实的,完整的深拷贝,请使用:
dttemp = orderedTable.Copy(); // copies structure and data
或
dttemp = orderedTable.Clone(); // copies the structure, but no data
答案 3 :(得分:0)
orderedTable只是持有对dttemp对象的引用,因此当您更改dttemp时,您正在更改内存中的数据,该数据与orderedTable引用的对象相同。
答案 4 :(得分:0)
dttemp=orderedTable;
该行将orderedTable
分配给dttemp
。然后根据定义调用dttemp
会影响orderedTable
。
答案 5 :(得分:0)
因为它是引用类型而不是值类型。
答案 6 :(得分:0)
在C#类中,变量通过引用保存,这意味着变量本身就像是指向实际数据的指针。因此,变量(基元除外)并不真正保存数据,只是指向您分配给它的数据。
在您的情况下,您指向一个空表:
DataTable dttemp = new DataTable();
然后你指向另一张桌子:
dttemp=orderedTable;
这有效地导致了两件事:
变量dttemp
现在指向orderedTable
您在第一行中创建的新表没有指向它的任何内容。它在内存中丢失而没有引用它,并将在垃圾收集器运行时完成。