1

我对 VB.NET 有点陌生。我需要在数组中保存一种特殊类型的数据。然后我在其他子例程中使用数据。我编写了以下代码作为示例来询问我的问题。

在其他方法中打印或显示数组中的数据时,它没有给出我之前设置的正确值!这可能是什么原因。我需要更改什么来解决问题?

Public Class Form1
    Private eList = New List(Of Boolean) From {True, True, True, False}
    Private eType = New List(Of String) From {"a1", "a2", "b1", "z"}
    Dim Dizi(0 To 1, 0 To 3) As ITEM
    Friend ITEM As ITEM

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim iA As ITEM = New ITEM

        For i = 0 To 3
            Dizi(0, i) = New ITEM
            Dizi(1, i) = New ITEM
        Next

        For i = 0 To 3
            iA.Enable = eList(i)
            iA.Type = eType(i)
            Dizi(0, i) = iA
            ' iA = Dizi.GetValue(0, i)  ' this for checking the setted value on the array cell.
        Next
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        For i = 0 To 3
            Dizi(1, i) = Dizi(0, i)
        Next
        Debug.Print(Dizi(0, 2).Type & " " & Dizi(1, 2).Type)
    End Sub
End Class

Class ITEM
    Property Enable As Boolean
    Property Type As String
End Class
4

1 回答 1

0

我怀疑你的问题在这里:

For i = 0 To 3
    iA.Enable = eList(i)
    iA.Type = eType(i)
    Dizi(0, i) = iA
Next

相反,您可能想要做的是:

For i = 0 To 3
    Dizi(0, i).Enable = eList(i)
    Dizi(0, i).Type = eType(i)
Next

或这个:

For i = 0 To 3
    iA = New ITEM()
    iA.Enable = eList(i)
    iA.Type = eType(i)
    Dizi(0, i) = iA
Next

您的困惑可能是由于没有正确理解值类型引用类型之间的区别。我建议做一些研究来了解这两种类型之间的区别。

在您的代码中,您正在设置Dizi(0, 0)Dizi(0, 1)Dizi(0, 2)Dizi(0, 3)都引用同一个对象(由 引用的同一个ITEM实例iA)。由于ITEM是引用类型( a Class,而不是 a Structure),当您将一个ITEM变量设置为等于另一个ITEM变量时,它不会复制该对象。它只复制对同一对象的引用。换句话说,当ITEM通过一个变量设置属性时,相同的更改会自动并立即反映在另一个变量中。这不会发生,因为更改会自动复制到所有变量。发生这种情况是因为这两个变量本质上是同一个对象的两个不同名称。

于 2013-07-30T12:16:40.850 回答