繁体   English   中英

自变量将ByVal传递给VB.NET Function并在那里进行操作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM