1

在这个 Microsoft 示例中,一个 Doubles 数组被传递给函数MultiplyMatricesSequential(...),并使用修饰符MultiplyMatricesParallel(...)作为参数结果:http: //msdn.microsoft.com/de-de/library/dd460713 (v=vs.110).aspxByVal

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

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

4

2 回答 2

1

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

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

如果您向函数 ByVal 发送一个内在值,例如Int32,则该值将被放入堆栈中,并且该函数根本无法编辑。

于 2014-05-04T18:39:05.487 回答
0

区别在于“值类型”和“引用类型”。值类型定义为“结构”(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
于 2014-05-05T04:58:50.010 回答