繁体   English   中英

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

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

在过去一周左右的时间里,我的代码遇到了一个问题,它一直让我想弄清楚它有什么问题。 我已经从我的主要项目中提取并隔离了这个问题,但问题仍然不明显。

本质上,我有一个 function,它通常会做很多事情,但在这个例子中,只是更改了一个名为 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

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

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

并且不修改 rest,问题仍然存在 - 出于某种原因,由于 ByVal 状态,TrueTable 正在更新而不应该更新。

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

非常感谢,阿尔菲:)

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

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

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

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

如果您不想更改TrueTable ,请定义另一个 Array 并将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

结果:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM