[英]Argument passed ByVal to VB.NET Function and manipulated there
在此Microsoft示例中,使用ByVal
修饰符MultiplyMatricesSequential(...)
双精度数组传递给函数MultiplyMatricesSequential(...)
和MultiplyMatricesParallel(...)
作为参数结果: http : //msdn.microsoft.com/de-de/library/dd460713 (v = vs.110)的.aspx
在这些函数中正在修改数组中的值,并且在函数调用返回后,更改才可用。 当我在MultiplyMatricesSequential(...)
函数中将ByVal
更改为ByRef
,没有任何变化,当我在第二个函数中将ByRef
更改为ByRef
,IDE则抱怨无法在Lambda表达式中操作的参数通过引用传递。
我现在想知道,当强制使用ByVal
时,调用者中的数组值如何变化?
将对象ByVal传递给函数时,将指向它的指针放在堆栈上。 然后,函数可以修改对象的内部部分,但不能用新对象替换它。
当您传递对象ByRef时,您改为将一个指向对象指针的指针放在堆栈上。 该函数现在可以用一个新对象替换整个对象。
如果将内部值(例如Int32
)发送给函数ByVal,则该值将放在堆栈上,并且该函数完全不能对其进行编辑。
区别在于“值类型”和“引用类型”之间。 值类型定义为“结构”(VB.NET)或“结构”(C#),而引用类型定义为“类”。 整数,双精度和布尔型等原始类型是值类型。 数组是引用类型。 正如@MattiasÅslund指出的那样,无论是通过ByVal还是ByRef传递,都始终使用引用类型传递指针。
如果确实要操纵传递的数组,但将原始数组返回到调用过程,则需要将副本复制到新的本地声明的数组中。 但是,如果传递非常大的数组,请当心开销。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.