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

时间:2013-11-25 04:37:24

标签: 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) = "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,我觉得不重要。 -

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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 :(得分:1)

想一想你在这里做了什么:

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)

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