2015-10-26 273 views
-1

我正在嘗試創建一個Dictionary集合的關鍵字,其中每個關鍵字都有相應的「look」類的值。 以下示例不起作用。它給我:
第一 - 圈,藍色
第二 - 圈,藍色

雖然我需要:
第一 - 廣場,紅色
第二 - 圈,藍色

它爲何不工作,我怎麼能使它工作?
謝謝。
如何在VB.NET中使用Dictionary類

Public Class Form1 

Public Class look 
    Public shape As String 
    Public color As String 
End Class 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim myDict As New Dictionary(Of String, look) 
    Dim oLook As New look 
    oLook.shape = "square" 
    oLook.color = "red" 
    myDict.Add("first", oLook) 
    oLook.shape = "circle" 
    oLook.color = "blue" 
    myDict.Add("second", oLook) 
    For Each key In myDict.Keys 
     MsgBox(key & " - " & myDict(key).shape & ", " & myDict(key).color) 
    Next 
End Sub 
End Class 
+1

的[什麼是C#中的引用類型和值類型之間的差異可能的複製?](http://stackoverflow.com/questions/5057267/what-is-the-difference-between-a-reference-type-and-value-type-in​​-c) –

+1

如果你想要兩個外觀對象,創建兩個看物體。 –

回答

2

試試這個:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim myDict As New Dictionary(Of String, look) 
    Dim oLook As New look 
    oLook.shape = "square" 
    oLook.color = "red" 
    myDict.Add("first", oLook) 
    oLook = new look ' This will create another oLook object and point olook at it. 
    oLook.shape = "circle" 
    oLook.color = "blue" 
    myDict.Add("second", oLook) 
    For Each key In myDict.Keys 
     MsgBox(key & " - " & myDict(key).shape & ", " & myDict(key).color) 
    Next 
End Sub 
+0

感謝您的幫助。任何人都可以解釋我是如何工作的嗎?我有兩個oLook對象嗎?在向字典中添加價值之後,我如何銷燬它們?我的字典將有大約十億個密鑰,所以我需要經濟實惠。 – GreenBear

+2

@GreenBear oLook不包含您的對象,而是對創建的對象的引用(通過使用新的)。所以當你設置它的形狀和顏色時,它指的是被引用的對象。將它添加到字典時,它也是存儲的參考。這就是爲什麼「兩個」oLook被更新爲相同的值(被引用的對象仍然是相同的,只有它的成員發生了變異)。如果我做一個類比,就像給某人的房子是紅色的地址,在某處存儲該地址,然後用藍色繪製房屋並存儲(相同)地址;兩個地址都是指同一棟藍屋 – Sehnsucht

+2

@GreenBear的拆除部分; (我在這裏簡化了一些東西):只要「某事」持有對它的引用,一個對象就在記憶中。只要沒有人保留引用(例如,通過將變量設置爲Nothing和/或刪除字典中的鍵/值對),該對象就有資格被垃圾收集器收集。這是他在某些時候會有效地「釋放」記憶(在經典場景中,我們並不真正控制何時)。 – Sehnsucht

2

您需要的類的新實例:

Dim myDict As New Dictionary(Of String, look) 
    Dim oLook As New look 
    oLook.shape = "square" 
    oLook.color = "red" 
    myDict.Add("first", oLook) 
    oLook = New look '<<<<<<<<<<<< 
    oLook.shape = "circle" 
    oLook.color = "blue" 
    myDict.Add("second", oLook) 
    For Each key In myDict.Keys 
     MsgBox(key & " - " & myDict(key).shape & ", " & myDict(key).color) 
    Next 
+0

感謝您的幫助。任何人都可以解釋我是如何工作的嗎?我有兩個oLook對象嗎?在向字典中添加價值之後,我如何銷燬它們?我的字典將有大約十億個密鑰,所以我需要經濟實惠。 – GreenBear

+0

你正在存儲你的類的實例查看字典。在上面的代碼中注意到第二個'New Look' - 創建一個新實例來存儲。如果你只有幾種形狀和顏色的組合,並且有10億個「記錄」來跟蹤這個並不是正確的方法。如果每一億個都是獨一無二的,那麼你需要十億條記錄 - 而且你不會將這些數據存儲在內存中。 – rheitzman

+0

謝謝你,rheitzman,你給出了一個正確的答案,但該網站不允許我將兩個答案標記爲正確的。我寫的代碼是我實際需要做的簡化版本。所有的值都是唯一的。 – GreenBear