【问题标题】:ByVal DataTable ManipulationByVal 数据表操作
【发布时间】:2013-12-13 22:18:54
【问题描述】:

我认为我缺少有关 DataTables 如何工作的基本知识。以下过程从GetData 开始,将what 作为填充的DataTable 引入。以下代码所做的只是传递数据表的副本,对其进行操作,然后将其返回:

Sub GetData(ByVal what As DataTable)
    Dim Part As DataTable = Generate(what)
End Sub


Function Generate(ByVal brown As DataTable)
    Dim lameface As DataTable = DoStuff(brown)

    Return lameface
End Function


Function DoStuff(ByVal cow As DataTable)
    Dim result As DataTable = cow

    result.Rows.RemoveAt(0)

    Return result
End Function

按照上面的写法,函数DoStuff 将从result 中删除第一行 cow。同样,brownwhat 也将删除第一行,即使它们以 ByVal 发送。

如果我将DoStuff 中的第一行更改为

Dim result As DataTable = cow

Dim result As DataTable = cow.copy

然后 cowbrownwhat 将被单独留下。为什么是这样?将参数标记为ByVal 应该发送对象的副本 而不是原始对象,那么为什么我在实例化result 时告诉它使用副本?如果我使用整数而不是数据表执行类似的过程,它会按我的预期工作。我对数据表缺少什么?

我在 MSDN 的数据表文章中四处寻找,但没有看到任何与此相关的内容。感谢您的帮助!

【问题讨论】:

标签: vb.net datatable


【解决方案1】:

ByVal 关键字不一定表示将值的副本传递给方法。如果参数是引用类型,例如DataTable,则指针的副本将传递给方法 - 它仍然引用同一个对象,因此方法完成后对方法中的对象所做的任何更改都将保持不变执行。

ByRef 关键字将允许方法更改变量指向的对象,或者如果参数是简单类型(如int),则更改实际值。

在上述情况下,如果您想删除DoStuff 中的一行,但不影响源DataTable,那么您需要在执行删除操作之前复制DataTable

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 2019-11-21
  • 2013-09-26
  • 2015-10-30
  • 2019-08-12
  • 2019-04-07
  • 2021-03-11
  • 1970-01-01
相关资源
最近更新 更多