Аргумент передал ByVal в функцию VB.NET и манипулировал там

В этом примере Microsoft массив функций Double передается функциямMultiplyMatricesSequential(...) а такжеMultiplyMatricesParallel(...) в качестве аргумента в результате использованияByVal модификатор:http://msdn.microsoft.com/de-de/library/dd460713(v=vs.110).aspx

Значения в массивах изменяются в этих функциях, и эти изменения становятся доступными после возврата из вызова функций. Когда я меняюByValвByRef в функцииMultiplyMatricesSequential(...) ничего не меняется, когда я перехожу наByRefво второй функции IDE жалуется, что аргументы, которыми манипулируют в лямбда-выражениях, не могут быть переданы по ссылке.

Теперь мне интересно, как значения массива меняются в вызывающей программе при использованииByVal принуждают?

Ответы на вопрос(2)

Решение Вопроса

вы помещаете указатель на него в стек. Затем функция может затем изменить внутренние части объекта, но не заменить его новым объектом.

Когда вы передаете объект ByRef, вы вместо этого помещаете указатель на указатель объектов в стеке. Функция теперь может заменить весь объект новым.

Если вы отправляете внутреннюю стоимость, какInt32, для функции ByVal значение помещается в стек и не может быть отредактировано функцией.

 Bernhard Döbler05 мая 2014 г., 00:08
Что функция может заменить весь объект при передачеByRefхорошо сказано, спасибо.

определяются как «Структура» (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

Ваш ответ на вопрос