访问数组并获取与设置值不同的值

时间:2013-07-30 12:04:30

标签: arrays vb.net types

我对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

1 个答案:

答案 0 :(得分: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是引用类型(Class,而不是Structure),因此当您将一个ITEM变量设置为等于另一个ITEM变量时, 制作对象的副本。它只复制对同一对象的引用。换句话说,当通过一个变量设置ITEM属性时,相同的更改会自动立即反映在另一个变量中。这不会发生,因为更改会自动复制到所有变量。之所以发生这种情况,是因为这两个变量基本上是同一个对象的两个不同名称。