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

Arrays VB.NET-函数无法修改数组的成员,arrays,vb.net,byref,Arrays,Vb.net,Byref,我试图将数组传递给Sub,以便Sub可以修改数组的一个值 像这样的 Dim a As String = "STARTVALUE" PopulateDataSet("Management", {a}) Public Sub PopulateDataSet(ByRef SomeRandomOtherVariable As String, ByRef ToBePopulatedVariables() As String) ToBePopulatedVariables(0) = "TheN

我试图将数组传递给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
当我运行代码时,我可以单步遍历子代码,查看要填充的变量(0)的位置(即变量A)的值为“STARTVALUE”,然后该值将更改为“TheNewValue”

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

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


@karl anderson和Nadeem_MK都提出了同样的观点

但是

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

将值指定给(0)时

然而

Dim a As String() = {"FirstVariable"}
它跑了


但我仍然无法将新值返回到调用代码。我尝试过使用ByVal和ByRef,但对于数组,我认为这并不重要

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

在上一次编辑中,您试图将一个值分配给一个空数组,因此它应该启动一个未设置为对象实例的
对象引用
异常,您需要在声明以下内容时指定数组边界:

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
不返回任何内容,它只是将
更改为epopulatedvariables
。也不需要
ByRef

您只需传递一个包含数组的变量:

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

因此,在调用
PopulateDataSet

之后,您可以访问
a
(这是一个数组,而不是字符串),您应该为数组设置初始大小。否则,(0)或任何其他元素都不存在。字符串在.Net中是不可变的。更改数组第一个元素的值不会更改
a
指向的字符串。相反,它创建一个新字符串,并使数组的第一个元素指向该字符串。
Dim a As String() = {"STARTVALUE"}
PopulateDataSet("Management", a)