【问题标题】:VB.NET - Function Cannot Modify a Member Of An ArrayVB.NET - 函数不能修改数组的成员
【发布时间】:2013-11-25 04:37:24
【问题描述】:

我正在尝试将数组传递给 Sub,以便 Sub 可以修改数组的值之一。

类似的东西

Dim a As String = "STARTVALUE"

PopulateDataSet("Management", {a})

Public Sub PopulateDataSet(ByRef SomeRandomOtherVariable As String, ByRef ToBePopulatedVariables() As String)

    ToBePopulatedVariables(0) = "TheNewValue"

End Sub

当我运行代码时,我可以单步执行 Sub 并查看 ToBePopulatedVariables(0)(即变量 A)的值“STARTVALUE”,然后该值更改为“TheNewValue”。

但是当控制权被传递回调用代码时,a 的值会恢复为“STARTVALUE”。

我已经尝试了我能想到的一切。有什么想法吗?


@karl-anderson 和 Nadeem_MK 都提出了同样的建议。

但是

Dim a As String()
a(0) = "FirstVariable"
PopulateDataSet("Management", {a}) 

返回“对象引用未设置为对象的实例。”

将值赋给a(0)时

然而

Dim a As String() = {"FirstVariable"}

运行。

但我仍然坚持没有将新值返回给调用代码。我试过这样做 ByVal 和 ByRef 但对于数组我认为这并不重要。 ——

【问题讨论】:

  • 字符串在 .Net 中是不可变的。更改数组第一个元素的值,不会更改a 指向的字符串。相反,它会创建一个新字符串并使数组的第一个元素指向该字符串。

标签: arrays vb.net byref


【解决方案1】:

在您上一次编辑中,您尝试将一个值分配给一个空数组,因此它应该启动一个 Object reference not set to an instance of an object 异常,您需要在声明时指定数组边界:

Dim a(0) As String
a(0) = "FirstValue"

或者你可以这样做:

Dim a As String() = {"FirstValue"}

您在问题上发布的第一个代码运行良好(修复了一些语法),并且我所做的下一个修改也在运行,如果您仍然遇到数组边界/值问题,那么错误可能在其他部分你的代码。为确保这不是变量问题,请使用本示例中的任何方法声明它。

Public Class Form1
Private a As String()

Private Sub Test() ' Handles MyBase.Shown
    PopulateDataSet("Hello", a) : MsgBox(a.First)
    PopulateDataSet("World!", a, 5) : MsgBox(a(5))
    PopulateDataSet("I've said Hello World!", a, 10) : MsgBox(a.Last)
End Sub

Public Sub PopulateDataSet(ByVal NewValue As String,
                           ByRef Array As String(),
                           Optional ByVal ItemIndex As Integer = 0)

    If Array Is Nothing Then
        System.Array.Resize(Array, 1)
    ElseIf Not Array.Count > ItemIndex Then
        Do Until Array.Count > ItemIndex
            System.Array.Resize(Array, Array.Count + 1)
        Loop
    End If

    Array(ItemIndex) = NewValue

End Sub

End Class

【讨论】:

    【解决方案2】:

    想一想你在这里实际在做什么:

    Dim a As String = "STARTVALUE"
    
    PopulateDataSet("Management", {a})
    

    您创建一个名为a 的字符串,其值为STARTVALUE。然后创建一个包含a 的新数组({a})。你调用PopulateDataSet,它会替换数组的第一个元素。

    为什么你没有看到变化?

    变量a 根本没有改变,它仍然是STARTVALUE。 您没有对您创建的数组的引用,因此您将无法观察到该数组的更改(它甚至可能已经被垃圾回收了)。

    另外,PopulateDataSet 不返回任何内容,它只是更改了ToBePopulatedVariables。也不需要ByRef

    您应该简单地传递一个包含数组的变量:

    Dim a As String() = {"STARTVALUE"}
    PopulateDataSet("Management", a)
    

    这样您就可以在调用PopulateDataSet 之后访问a(它是一个数组,而不是一个字符串)。

    【讨论】:

      【解决方案3】:

      这是 vb.Net 吗?如果是这样,我认为您的数组声明是错误的。
      试试这个;

      Dim a(0) As String
      a(0) = "STARTVALUE"
      
      PopulateDataSet("Management", a)
      
      Public Sub PopulateDataSet(ByRef SomeRandomOtherVariable As String, ByRef ToBePopulatedVariables() As String)
      
          ToBePopulatedVariables(0) = "TheNewValue"
      
      End Sub
      

      【讨论】:

      • 您应该为数组设置一个初始大小。否则 a(0) 或任何其他元素不存在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2011-11-15
      • 2020-01-23
      相关资源
      最近更新 更多