繁体   English   中英

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

[英]VB.NET - Function Cannot Modify a Member Of An Array

我正在尝试将数组传递给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,但对于数组,我认为这并不重要。 -

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

在上一次编辑中,您尝试将一个值赋给一个空数组,以便它应启动Object reference not set to an instance of an object异常Object reference not set to an instance of an objectObject 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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM