声明为字符串的变量数组

Array of variables declared as string

我有一个关于创建声明为字符串的变量数组的查询。 下面是我的代码。在调试时,变量没有显示值。

需要帮助..

Module Module1

Public Status, PartStat, HomeStat, ClampStat, SldCylStat, PrsCylP1Stat, 
PrsCylP2Stat, PrsCylP3Stat, PrsCylP4Stat, PunchStat, SysInProc, Home1, 
Home2, Home3, CyclTim, TrqP1Stat, TrqP2Stat, TrqP3Stat, TrqP4Stat, 
AngleP1Stat, AngleP2Stat, AngleP3Stat, AngleP4Stat As String

Function AutoReadStatus()

    Dim StatArray = {HomeStat, ClampStat, SldCylStat, Home1, PrsCylP4Stat, 
    PrsCylP2Stat, Home2, PrsCylP3Stat, PrsCylP1Stat, Home3, PunchStat, 
    AngleP4Stat, AngleP2Stat, AngleP3Stat, AngleP1Stat, TrqP4Stat, 
    TrqP2Stat, TrqP3Stat, TrqP1Stat}

    Status = ReadMultiReg(FormAuto.SP1, "03", "1258", "0013")

    For i = 0 To ((Status.Length / 4) - 1)
        StatArray(i) = CInt("&H" & Status.Substring(i * 4, 4))
    Next

    Return Nothing
End Function
End Module

它甚至没有显示上述数组中任何变量的索引..

Label1.Text = Array.IndexOf(StatArray, SldCylStat)

当您为数组内的项目分配一个新值时,您为数组内的项目分配了一个新值(双关语)。

这意味着该项目的数组现在引用了您提供的字符串(或者更确切地说,整数隐式转换为字符串,因为您没有 Option Strict On)和先例引用(在您的 public 字段中) 被丢弃。

测试这个示例代码,我想你会明白

Public item As String

Sub Test()
    Dim array = {item}

    Console.WriteLine(array(0) Is item) ' True

    array(0) = "new value"

    Console.WriteLine(array(0) Is item) ' False
End Sub

您现在可以看到 array(0) 引用另一个对象而不是 item 字段引用的对象

至于如何解决它,y你可以传递所有这些字符串 ByRef 这样方法内部的赋值会反映在它之外,但那会很乏味。
IMO 的 "better" 方式是创建一个类型(Class)来保存所有这些字符串并将该类型的实例传递给您的方法,这样您就可以改变相同的现有对象。

快速、人为的示例:

Class SomeType
    Property Item As String
End Class

Sub Test(instance As SomeType)
    instance.Item = "new value"
End Sub

' Usage
Dim sample As New SomeType
' here sample.Item is Nothing

Test(sample)
' here sample.Item is "new value"