混淆ParamArray行为 - 重复数组以某种方式链接?

时间:2014-11-03 03:17:28

标签: vb.net paramarray

如果标题和问题不清楚,我们很抱歉;我没有一个很好的方式来描述它。但在这里:

所以正在发生的事情是" testMat" s以某种方式链接在一起,即使我没有重新定义它们,它也会使值发生变化。例如,如果你运行下面的代码,你会发现在testResult的matSum函数中,out1和out2的值正在改变(在循环中),我不明白为什么!他们的价值观在testResult1中没有变化。这种行为来自哪里?

Sub Main()

    Dim testMat As Double(,) = {{1, 2}, {3, 4}}

    Dim testResult As Double(,) = matSum(testMat, testMat, testMat)
    Dim testResult1 As Double(,) = matSum({{1, 2}, {3, 4}}, {{1, 2}, {3, 4}}, {{1, 2}, {3, 4}})

End Sub


Function matSum(ByVal ParamArray args As Double()(,)) As Double(,)
    'This function sums matrices. It assumes you know how to sum matrices.

    Dim m, n As Integer
    Dim out, out1, out2 As Double(,)
    Dim numArgs As Integer = args.Length

    out = args(0)
    out1 = args(1)
    out2 = args(2)
    m = out.GetUpperBound(0)
    n = out.GetUpperBound(1)

    For v As Integer = 1 To numArgs - 1
        For i As Integer = 0 To m
            For j As Integer = 0 To n
                out(i, j) = out(i, j) + args(v)(i, j)
            Next
        Next
    Next

    Return out

End Function

1 个答案:

答案 0 :(得分:1)

好的,为了让它多一点上下文。

Array是一种引用类型,因此当传递ByVal时,传递的值是引用。不复制或克隆该数组。参考是。但它仍然指向内存中的相同数组。

现在,当你在这里打电话给你的方法时。

Dim testResult As Double(,) = matSum(testMat, testMat, testMat)

outout1out2具有相同的值 - 对testMat的引用。使用任何这些变量修改该数组中的值将修改相同的数组,您也可以从其他引用中看到它。