函数中的 ByVal 和数组问题 (VB.NET)

Issue with ByVal and Arrays in Functions (VB.NET)

我 运行 在过去一周左右的时间里我的代码出现了问题,我一直在努力找出它的问题所在。我已经从我的主要项目中提取并隔离了问题,但问题仍然不明显。

本质上,我有一个通常会做很多事情的函数,但在这个例子中只是改变了一个名为 FalseTable 的数组中的 1 个元素。现在,我已将此变量设置为 ByVal,这意味着原始变量(即:TrueTable)不应更改,但是,它会更改!这是完整的代码:

Dim TrueTable(7) As Char
    Sub Main()
        Dim FalseTable(7) As Char
        For x = 0 To 7
            TrueTable(x) = "T"
        Next
        For x = 0 To 7
            FalseTable(x) = "F"
        Next

        Console.WriteLine("before")
        For x = 0 To 7
            Console.Write(TrueTable(x))
        Next
        Console.WriteLine()
        Test(TrueTable)
        Console.WriteLine("result")
        For x = 0 To 7
            Console.Write(TrueTable(x))
        Next
        Console.WriteLine()

        Console.ReadLine()
    End Sub

    Function Test(ByVal FalseTable() As Char) As Char()
        FalseTable(0) = "0"
        Return FalseTable
    End Function

现在,我曾经认为是函数中重复了名称“FalseTable”,但是即使我将函数更改为:

Function Test(ByVal SomeTable() As Char) As Char()
        SomeTable(0) = "0"
        Return SomeTable
    End Function

并且不修改其余部分,问题仍然存在 - 由于某种原因,由于 ByVal 状态,TrueTable 在不应该更新的时候正在更新。

如有任何帮助,我们将不胜感激;这可能是我忽略的一些愚蠢的事情,但它把我的头发拉出来了!!

非常感谢, 阿尔菲 :)

要理解为什么会发生这种情况,请想象一下这种情况。

您有一个常规的 TextBox1(这将是您的 TrueTable),现在您想将对象 TextBox1 传递给一个函数,如下所示:

Function Test(ByVal TextBoxAnything as TextBox) As String
    TextBoxAnything.Text = "0"
    Return ""
End Function

您了解您正在通过 TextBox1 传递并且一旦进入函数测试对象 TextBoxAnything 只是 TextBox1,您对 TextBoxAnything 所做的任何事情都是对 TextBox1 所做的。 TextBoxAnything 不存在,它只是指向 Textbox1。这就是为什么你的 TrueTable 的值也改变了。

如果您不想更改 TrueTable,请定义另一个数组并将 TrueTable 复制到它。

这是您可以参考的代码。

Dim TrueTable(7) As Char
Dim TrueTable2(7) As Char
Sub Main()
    For x = 0 To 7
        TrueTable(x) = "T"c
    Next

    Console.WriteLine("before")
    For x = 0 To 7
        Console.Write(TrueTable(x))
    Next
    Console.WriteLine()

    TrueTable.CopyTo(TrueTable2, 0)
    Test(TrueTable2)
    Console.WriteLine("result")
    For x = 0 To 7
        Console.Write(TrueTable(x))
    Next
    Console.WriteLine()

    Console.ReadLine()
End Sub

结果: