我认为我遗漏了关于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
的第一行。同样,brown
和what
也会删除第一行,即使它们是ByVal
。
如果我更改了DoStuff
中的第一行
Dim result As DataTable = cow
到
Dim result As DataTable = cow.copy
然后cow
,brown
和what
保持不变。为什么是这样?将参数标记为ByVal
应该发送对象的副本而不是原始对象,那么为什么我在实例化result
时告诉它使用副本?如果我使用整数而不是数据表执行类似的过程,它就像我期望的那样工作。我对数据表有什么看法?
我在MSDN的数据表文章中探讨过,并没有看到任何与之相关的内容。谢谢你的帮助!
答案 0 :(得分:4)
ByVal
关键字不一定表示将值的副本传递给方法。如果参数是引用类型,如DataTable
,那么指针的副本将传递给方法 - 它仍然引用同一个对象,因此对方法中的对象所做的任何更改都将保留一次方法完成执行。
ByRef
关键字允许方法更改变量指向的对象,如果参数是简单类型,则允许实际值(如int
)
在上述情况下,如果您要删除DoStuff
内的一行,但不影响来源DataTable
,则需要先复制DataTable
才能执行此操作删除操作。