关于DataTables的工作方式,我想我缺少一些基本的东西。下面的过程从GetData开始,将what作为一个填充的DataTable引入。下面的所有代码都是通过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的文章中搜索数据,但没有看到任何与此相关的信息。谢谢你的帮忙!
发布于 2013-12-13 14:18:54
ByVal关键字不一定表示将值的副本传递给该方法。如果参数是引用类型,如DataTable,则指针的副本将传递给该方法--它仍然引用相同的对象,因此,一旦方法完成执行,对方法中的对象所做的任何更改都将得到维护。
ByRef关键字将允许方法更改变量所指向的对象,如果参数是简单类型(如int),则允许更改实际值。
在上述情况下,如果希望删除DoStuff中的一行,但不影响源DataTable,则需要在执行删除操作之前复制DataTable。
https://stackoverflow.com/questions/20568625
复制相似问题