在我的winform程序中(在vb.net中)我写道:
Dim dt As New DataTable
'Get data from DB into dt
'...
Dim dttemp As New DataTable
dttemp = dt
dt.Clear()
'...
但是当我运行该程序时,Clear()
同时清除了dt
和dttemp
!
为什么? dt
和dttemp
不应该是DataTable
的两个不同实例吗?
(我终于找到了一个解决方案 - dttemp = dt.Copy()
而不是dttemp = dt
。但在这种情况下,我仍然无法理解为什么Copy()
是必要的。抱歉,如果这是一个基本问题 - 我我是一名初学程序员。)
答案 0 :(得分:4)
当您撰写dttemp = dt
时,您正在更改dttemp
以引用与DataTable
相同的dt
个实例。
它不会创建实例的单独副本。
值类型(结构)的行为与您期望的方式相同,但引用类型(类)不行。
答案 1 :(得分:3)
这是因为DataTable
是引用类型。
dttemp
和dt
的值只是对同一对象的引用。
如果我在一张纸上写下我的地址然后把它交给两个人,那么其中一个就会把我弄清楚(清理我的房子/ 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
时,您正在创建该类的实例,并设置指向该特定实例的引用。
因此,在您的代码中dt
和dttemp
只是对DataTable对象的引用。
所以你的代码所做的是:
DataTable
对象,并将dt
引用设置为指向它DataTable
对象,并将dttemp
引用设置为指向它dttemp
引用设置为指向dt
引用的任何内容(在本例中为第一个数据表)。这有效地使第二个数据表孤立,并使其有资格进行垃圾收集。因此,由于dt
和dttemp
都引用同一个对象,无论通过哪个对象完成,都可以通过第二个看到。
当您执行dt.Copy()
时,您正在创建DataTable类的另一个实例,将值从第一个数据表复制到第二个数据表,然后返回第二个数据表。
这样你就有两个独立的实例,你可以按照自己的意愿进行管理。