【问题标题】:Issue with ByVal and Arrays in Functions (VB.NET)函数中的 ByVal 和数组问题 (VB.NET)
【发布时间】:2022-01-24 02:00:30
【问题描述】:

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

本质上,我有一个通常可以做很多事情的函数,但在这个示例中,它只更改了一个名为 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 正在更新,而不应该更新。

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

非常感谢, 阿尔菲:)

【问题讨论】:

  • 为什么您认为将引用类型的集合传递给方法并更改其内容不应该影响集合本身?
  • ByVal 适用于数组对象,而不是数组内容。复制数组以使原始内容不能更改必须显式完成,提醒您成本,使用 Array.Copy()。
  • 现在和永远开启 Option Strict。项目属性 -> 编译选项卡。也适用于未来的项目工具 -> 选项 -> 项目和解决方案 -> VB 默认值

标签: vb.net visual-studio


【解决方案1】:

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

您有一个常规的 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 的值也会改变。

【讨论】:

    【解决方案2】:

    如果您不想更改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
    

    结果:

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 2012-01-21
      • 2015-02-15
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多