首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ByVal DataTable操纵

ByVal DataTable操纵
EN

Stack Overflow用户
提问于 2013-12-13 14:14:04
回答 1查看 2.5K关注 0票数 2

关于DataTables的工作方式,我想我缺少一些基本的东西。下面的过程从GetData开始,将what作为一个填充的DataTable引入。下面的所有代码都是通过datatable的副本,操作它,然后返回它:

代码语言:javascript
复制
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将从resultcow中移除顶部的行。类似地,brownwhat也将删除第一行,即使它们作为ByVal发送。

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

代码语言:javascript
复制
Dim result As DataTable = cow

代码语言:javascript
复制
Dim result As DataTable = cow.copy

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

我在MSDN的文章中搜索数据,但没有看到任何与此相关的信息。谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-13 14:18:54

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

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20568625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档