我对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
答案 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
属性时,相同的更改会自动立即反映在另一个变量中。这不会发生,因为更改会自动复制到所有变量。之所以发生这种情况,是因为这两个变量基本上是同一个对象的两个不同名称。