2011-10-04 24 views
0

我有以下類:爲什麼List.Clear()也拋棄了類屬性?

Public Class ID 
     Private sID as List(Of Integer) 

     Public property IDlist as List(Of Integer) 
      Get 
       Return sID 
      End Get 
      Set(ByVal value as List(Of Integer) 
       sID = value 
      End Set 
     End Property 
    End Class 

然後我做的:

Dim objID as ID 
    Dim myList as List(Of Integer) 

    for i = 0 to 1 
     objID = New ID 
     MyList.add(1) 
     Mylist.add(2) 

     ID.IDlist = mylist 
     mylist.clear 
    Next 

如果我插入代碼檢索ID.IDlist性質的一前mylist.clear它工作正常,兩個迭代。但是,如果我嘗試檢索for循環後的值,我什麼也得不到。

我發現這個代碼可以讓我以後得到ID.IDlist兩個ID對象爲循環:

Dim objID as ID 
    Dim myList as List(Of Integer) 

    for i = 0 to 1 
     objID = New ID 
     mylist = New List(Of Integer) 

     MyList.add(1) 
     Mylist.add(2) 

     ID.IDlist = mylist 
    Next 

我可能是方式在這裏下車,但它似乎像ID.IDlist點mylist的地址等等,當mylist被清除時,ID.Idlist也是如此。看起來好像第二塊代碼工作的原因是因爲我在內存中爲每個ID對象和ID創建了一個新列表.ID列表只是指向它......是嗎?

任何人都可以確認/解釋?我花了5個小時在這種情況..呃

謝謝你的任何解釋!

+0

你的假設是正確的。 – Ankur

回答

2

是的,你正在傳遞一個引用類型,這意味着你正在創建一個指向棧中對象的指針的副本。

爲了防止發生這種情況,您可以製作列表的淺表副本。在這種情況下,通過使用擴展方法ToList()將很容易。

objId.IDlist = myList.ToList() 
+0

非常好:)謝謝! – kdonah3

1

當你這樣做:ID.IDlist = MYLIST

兩個ID.IDlist和MYLIST是完全相同的清單。如果你清除一個,你也清除另一個。

此外,我不認爲這將編譯,因爲ID是一個類,而不是一個對象。

+0

woops,是的,這是一個錯字。我輸入它而不是複製/粘貼 - 在我的實際代碼中,我確實是正確的。謝謝 :) – kdonah3

相關問題