为什么Clear()清除了两个DataTables?

时间:2011-02-28 14:51:37

标签: vb.net winforms datatable

在我的winform程序中(在vb.net中)我写道:

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()是必要的。抱歉,如果这是一个基本问题 - 我我是一名初学程序员。)

4 个答案:

答案 0 :(得分:4)

当您撰写dttemp = dt时,您正在更改dttemp以引用与DataTable相同的dt个实例。

它不会创建实例的单独副本。

值类型(结构)的行为与您期望的方式相同,但引用类型(类)不行。

答案 1 :(得分:3)

这是因为DataTable引用类型

dttempdt的值只是对同一对象的引用。

如果我在一张纸上写下我的地址然后把它交给两个人,那么其中一个就会把我弄清楚(清理我的房子/ DataTable)然后如果第二个人来看我,他们会发现房子是空的。这就是这里发生的事情。

我有一篇关于reference types and value types的文章(基于C#,但同样适用),你可能觉得它很有用。

答案 2 :(得分: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()
'...

答案 3 :(得分:0)

每当您执行variable = New Something时,您正在创建该类的实例,并设置指向该特定实例的引用

因此,在您的代码中dtdttemp只是对DataTable对象的引用。

所以你的代码所做的是:

  1. 创建新的DataTable对象,并将dt引用设置为指向它
  2. 创建另一个DataTable对象,并将dttemp引用设置为指向它
  3. dttemp引用设置为指向dt引用的任何内容(在本例中为第一个数据表)。这有效地使第二个数据表孤立,并使其有资格进行垃圾收集。
  4. 因此,由于dtdttemp都引用同一个对象,无论通过哪个对象完成,都可以通过第二个看到。
    当您执行dt.Copy()时,您正在创建DataTable类的另一个实例,将值从第一个数据表复制到第二个数据表,然后返回第二个数据表。 这样你就有两个独立的实例,你可以按照自己的意愿进行管理。