ByVal数据表操作

Jon*_*Jon 2 vb.net datatable

我想我缺少有关DataTables工作原理的一些基本知识。以下过程从开始GetDatawhat以填充的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
Run Code Online (Sandbox Code Playgroud)

这上面写的方式,功能DoStuff将去除顶行result cow。同样,即使将第一行发送为,brownwhat将删除该行ByVal

如果我将第一行DoStuff

Dim result As DataTable = cow
Run Code Online (Sandbox Code Playgroud)

Dim result As DataTable = cow.copy
Run Code Online (Sandbox Code Playgroud)

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

我在MSDN上有关数据表的文章中闲逛,却没有发现任何有关此问题的信息。谢谢你的帮助!

dav*_*soa 5

ByVal关键字并不一定表明该值的副本传递给方法。如果参数是引用类型(如)DataTable,则将指针的副本传递给方法-它仍引用相同的对象,因此一旦方法完成执行,对方法中对象的任何更改都将保留。

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

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