2014-05-04 52 views
1

在該微軟採樣陣列的雙打被傳遞給使用ByVal改性劑的功能MultiplyMatricesSequential(...)MultiplyMatricesParallel(...)作爲參數的結果:http://msdn.microsoft.com/de-de/library/dd460713(v=vs.110).aspx參數傳遞到BYVAL VB.NET功能和操作有

值陣列中正在修改在這些函數和更改在調用函數返回後可用。 當我在函數MultiplyMatricesSequential(...)中更改ByValByRef時,沒有任何更改,當我在第二個函數中更改爲ByRef時,IDE抱怨在Lambda表達式中操作的參數不能通過引用傳遞。

我現在想知道當使用ByVal被強制時,在調用者中數組值如何變化?

回答

1

當您將一個對象ByVal傳遞給一個函數時,您將一個指針放在堆棧上。然後函數可以修改對象的內部部分,但不能用新對象替換它。

當您傳遞一個ByRef對象時,您將一個指向堆棧上的對象指針的指針放在該對象上。該函數現在可以用新的函數替換整個對象。

如果將一個固有值(如Int32)發送到函數ByVal,該值將被放入堆棧並且根本不能被該函數編輯。

+0

該函數可以在傳遞'ByRef'時替換整個對象,謝謝。 –

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