1

この Microsoft のサンプルでは、​​Double の配列が関数に渡され、MultiplyMatricesSequential(...)修飾子をMultiplyMatricesParallel(...)使用して引数の結果として返されますByVal

配列内の値はこれらの関数で変更されており、関数への呼び出しが戻った後に変更が利用可能になります。関数内に変更ByValしても何も変わらず、2 番目の関数に変更すると、IDE は、Lambda 式で操作されている引数を参照渡しできないと不平を言います。ByRefMultiplyMatricesSequential(...)ByRef

ByValの使用が強制されているときに、配列の値が呼び出し元でどのように変化するのだろうか?

4

2 に答える 2

0

違いは「値型」と「参照型」です。値型は「構造体」(VB.NET) または「構造体」(C#) として定義され、参照型は「クラス」として定義されます。integer、double、boolean などのプリミティブ型は値型です。配列は参照型です。@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 に答える