2013-07-30 45 views
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 

回答

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)所有引用同一個對象(這是由iA引用相同ITEM實例)。由於ITEM是參考類型(一個Class,而不是一個Structure),當您設置一個ITEM變量等於另一個ITEM變量時,它確實而不是複製該對象。它只會將引用複製到同一個對象。換句話說,當通過一個變量設置ITEM屬性時,相同的更改會自動立即反映到另一個變量中。這不會發生,因爲更改會自動複製到所有變量。發生這種情況是因爲兩個變量實質上是同一個對象的兩個不同的名稱

+1

謝謝Lot。適用於Structure而不是Class。 – AkKi