VB.NET-函数无法修改数组的成员



我正试图将数组传递给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}) 

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

将值分配给(0)时

然而

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

确实运行。

但我仍然坚持新的值没有返回到调用代码中。我已经尝试过ByVal和ByRef,但对于Arrays,我认为这无关紧要

在上次编辑中,您正试图将一个值分配给一个空数组,因此它应该启动一个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

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

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(它是一个数组,而不是字符串)。

这是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

相关内容

  • 没有找到相关文章

最新更新