2012-06-15 234 views
3

我在將VB.NET列表對象設置爲另一個時遇到問題。在下面的示例中,我在ReadLocations上創建一個實例,然後創建一個對象ReadLocation,然後我通過ReadLocations循環並設置ReadLocation1等於rl將VB.NET列表對象複製到另一個列表對象

會發生什麼,如果我然後去ReadLocation1其他(assdfhsd)它也會改變ReadLocations指數。我真的很困惑,爲什麼它會這樣做,除非它是「=」符號意味着引用而不是實際設置值。請幫忙,因爲我是C#開發人員,但我正在修改的程序在VB.NET中。

Dim ReadLocations As New List(Of Model.ReadLocation) 
Dim rl1 As New Model.ReadLocation 
rl1.LL = "a" 
Dim rl2 As New Model.ReadLocation 
rl2.LL = "b" 
ReadLocations.Add(rl1) 
ReadLocations.Add(rl2) 

Dim ReadLocation11 As New Model.ReadLocation 

For Each rl As Model.ReadLocation In ReadLocations 
    ReadLocation11 = rl 
Next 
+0

什麼是「ReadLocation1」? 'ReadLocation11'是一個錯字嗎? – sloth

+0

你的意思是:'它會改變ReadLocations索引'? – sloth

+0

ReadLocation1是一個Model.ReadLocation,它是一個類。我的意思是ReadLocations索引是如果我更改ReadLocation1(不是拼寫錯誤),它將更改ReadLocations中同一對象的值。 –

回答

6

如果ReadLocation是引用類型(一類),則所有的變量設置爲一個類將始終是引用的對象的實例。 =操作符僅在對參考類型進行操作時才設置對對象的新引用。它永遠不會創建對象的克隆(除非它是一個值類型)。在C#中也是如此。做你想做的唯一方法就是在將對象添加到第二個列表中時克隆這些對象。不幸的是,.NET沒有提供一個簡單的自動方法來克隆任何對象。執行此操作的標準方法是在ReadLocation類中實現ICloneable接口。然後,你可以通過調用clone方法克隆它:

ReadLocation1 = CType(rl.Clone(), ReadLocation) 

然而,該克隆方法裏面,你將需要創建ReadLocation的新實例,並手動設置其所有屬性,然後返回。例如:

Public Class ReadLocation 
    Implements ICloneable 

    Public Function Clone() As Object Implements ICloneable.Clone 
     Dim clone As New ReadLocation() 
     clone.Property1 = Me.Property1 
     clone.Property2 = Me.Property2 
     Return clone 
    End Function 
+0

真棒,工作。非常感謝。 –

相關問題