ByVal DataTable操作

时间:2013-12-13 14:14:04

标签: vb.net datatable

我认为我遗漏了关于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的数据表文章中探讨过,并没有看到任何与之相关的内容。谢谢你的帮助!

1 个答案:

答案 0 :(得分:4)

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

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

在上述情况下,如果您要删除DoStuff内的一行,但不影响来源DataTable,则需要先复制DataTable才能执行此操作删除操作。