为什么datatable.Clear,也清除其他数据表?

时间:2011-01-14 19:51:42

标签: c# .net

DataTable dttemp = new DataTable();
dttemp=orderedTable;
dttemp.Rows.Clear();

由于某种原因,orderedTable也被清除了!有谁知道为什么会这样?

7 个答案:

答案 0 :(得分:8)

当你执行这一行时:

dttemp = orderedTable;

实际上只有一个DataTable是相关的。您在第一行代码中创建的DataTable符合垃圾回收条件 - 没有任何注意事项。此处引用的行不会复制对象 - 它会复制引用,以便dttemporderedTable引用到同一个DataTable

DataTable是参考类型。您完全理解至关重要,了解引用类型在C#中的工作原理 - 否则整个语言将为您带来令人困惑的结果。我有一个article,您可能会发现这些行很有用。

要将代码置于上下文中,假设DataTable实际上是一个房子。您将家庭住址提供给两个不同的人。一个人去把房子涂成红色......然后另一个人去看房子。显然他会发现它是红色的。

重要的是你没有给每个人“你的房子” - 你只是给了他们一个到达你家的方式。这就是引用类型在C#中的工作方式。

dttemp的值不是DataTable - 它是DataTable引用。通过dttemp仍可以看到通过任何其他变量对该对象所做的更改。

答案 1 :(得分:4)

您有两个变量(dttemporderedTable),在您调用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;

这有效地导致了两件事:

  1. 变量dttemp现在指向orderedTable

  2. 您在第一行中创建的新表没有指向它的任何内容。它在内存中丢失而没有引用它,并将在垃圾收集器运行时完成。