首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >参数将ByVal传递给VB.NET函数并在那里进行操作。

参数将ByVal传递给VB.NET函数并在那里进行操作。
EN

Stack Overflow用户
提问于 2014-05-04 18:29:07
回答 2查看 1.3K关注 0票数 1

在此Microsoft示例中,使用MultiplyMatricesSequential(...)修饰符:http://msdn.microsoft.com/de-de/library/dd460713(v=vs.110).aspx将一个双重数组作为参数结果传递给函数ByValhttp://msdn.microsoft.com/de-de/library/dd460713(v=vs.110).aspx

数组中的值在这些函数中被修改,这些更改在调用函数返回后可用。当我在函数ByVal中将ByRef更改为MultiplyMatricesSequential(...)时,没有什么改变,当我在第二个函数中更改为ByRef时,MultiplyMatricesSequential(...)抱怨在Lambda表达式中操作的参数不能通过引用传递。

现在,我想知道当强制使用ByVal时,数组值在调用方中是如何变化的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-04 18:39:05

当将对象ByVal传递给函数时,可以在堆栈上放置指向它的指针。然后,函数可以修改对象的内部部分,但不能用新对象替换它。

在传递对象ByRef时,可以将指向对象指针的指针放在堆栈上。这个函数现在可以用一个新的对象替换整个对象。

如果将一个内部值(如Int32 )发送给函数ByVal,则该值将放在堆栈上,函数根本无法编辑。

票数 1
EN

Stack Overflow用户

发布于 2014-05-05 04:58:50

区别是“值类型”和“引用类型”。值类型定义为"Structure“(VB.NET)或"Struct”(C#),而引用类型被定义为"Class“。原语类型,如整型、双型和布尔型是值类型。数组是引用类型。正如@Mattias所指出的,无论是传递ByVal还是ByRef,对于引用类型,您总是传递一个指针。

如果您确实希望操作传递的数组,但将原始数组返回到调用过程,则需要将副本复制到新的本地声明数组中。但是,如果传递非常大的数组,请注意开销。

代码语言:javascript
代码运行次数:0
运行
复制
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim myOriginalArray As String() = New String() {"Hello", "to", "you", "Michael"}
    ManipulateArray(myOriginalArray)
    MessageBox.Show("myOriginalArray = " & myOriginalArray(0) & " " & myOriginalArray(1) & " " & myOriginalArray(2) & " " & myOriginalArray(3))
End Sub

Private Sub ManipulateArray(ByVal myOriginalArray As String())
    Dim myCopyArray(myOriginalArray.GetUpperBound(0)) As String
    myOriginalArray.CopyTo(myCopyArray, 0)
    myCopyArray(3) = "Sarah"
    MessageBox.Show("myCopyArray = " & myCopyArray(0) & " " & myCopyArray(1) & " " & myCopyArray(2) & " " & myCopyArray(3))
End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23459976

复制
相关文章

相似问题

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