【问题标题】:Why did Clear() clear both DataTables?为什么 Clear() 清除了两个数据表?
【发布时间】:2011-07-05 20:04:33
【问题描述】:

在我的 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()。对不起,如果这是一个基本问题 - 我是一个初学者程序员。 )

【问题讨论】:

  • "dttemp = dt" 将您的临时变量分配给与您的主要“dt”相同的实例,因此它们都对同一对象持有相同的引用。更有意义?

标签: vb.net winforms datatable


【解决方案1】:

当您编写dttemp = dt 时,您将更改dttemp 以引用与dt 相同的DataTable 实例。

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

值类型(结构)的行为方式符合您的预期,但引用类型(类)则不然。

【讨论】:

    【解决方案2】:

    这是因为DataTable 是一个引用类型

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

    如果我在一张纸上写下我的地址并将其交给两个人,那么其中一个人会偷窃我(清理我的房子/数据表),然后如果第二个人来拜访我,他们会发现房子是空的。这就是这里发生的事情。

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

    【讨论】:

    • 很好的类比。所以Copy() 相当于建造另一座房子,与第一座相同,但在街上?然后给号手两个不同的地址。对吗?
    • @kodkod:不一定在同一个地方——但是是的,它会用同样的东西的副本建造另一所房子。所以如果窃贼从一所房子里偷走,副本就会保留下来完好无损。
    【解决方案3】:
    You should do:
    
    Dim dt As New DataTable
    'Get data from DB into dt
    '...
    
    Dim dttemp As New DataTable
    dttemp = dt.Copty()
    dt.Clear()
    '...
    

    【讨论】:

      【解决方案4】:

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

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

      所以你的代码的作用是:

      1. 创建一个新的DataTable 对象,并将dt 引用设置为指向它
      2. 创建另一个DataTable 对象,并将dttemp 引用设置为指向它
      3. dttemp 引用设置为指向dt 所引用的任何内容(在本例中为第一个数据表)。这有效地孤立了第二个数据表,并使其符合垃圾回收条件。

      因此,由于dtdttemp 都引用了同一个对象,因此无论通过第一个执行的操作,都将通过第二个可见。
      当您执行dt.Copy() 时,您正在创建 DataTable 类的另一个实例,将值从第一个数据表复制到第二个数据表,然后返回第二个。 这样您就有了两个独立的实例,您可以随意管理它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 2021-12-09
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多