比方說,我有一個叫創建該對象的「克隆」,而不是指向它
myFirstList
列表,然後我想創建一個列表的副本,所以我可以做我自己的一些調整。所以我這樣做:
mySecondList = myFirstList
mySecondList.doTweaks
但我注意到,調整也影響myFirstList
對象!我只想調整影響第二個...
而事後我會想要完全刪除mySecondList
,所以我做mySecondList = Nothing
,我很好,對不對?
比方說,我有一個叫創建該對象的「克隆」,而不是指向它
myFirstList
列表,然後我想創建一個列表的副本,所以我可以做我自己的一些調整。所以我這樣做:
mySecondList = myFirstList
mySecondList.doTweaks
但我注意到,調整也影響myFirstList
對象!我只想調整影響第二個...
而事後我會想要完全刪除mySecondList
,所以我做mySecondList = Nothing
,我很好,對不對?
但我注意到,調整也 影響myFirstList對象!我只 希望調整影響第二 一個...
當然它中。這兩個變量都指向內存中的相同對象。你對這個人做的任何事情都發生在另一個人身上。
根據您的要求,您將需要執行深層克隆或淺層克隆。 This article應該給你一個更好的想法你需要做什麼
既然你沒有透露你存儲在你的列表中的物品的類型,我認爲這是實施IClonable的東西(否則,如果可以的話,實現IClonable,或想出一種方法克隆列表中的單個項目)。
嘗試是這樣的
mySeconmySecondList = myFirstList.[Select](Function(i) i.Clone()).ToList()
上亞當Rackies擴大的回答,我能夠實現使用VB.NET下面的代碼。
我的目標是複製主要用作數據傳輸對象(即數據庫數據)的對象列表。第一類dtoNamedClass定義和ShallowCopy方法被添加。創建一個名爲dtoNamedClassCloneVar的新變量,並使用LINQ select查詢複製對象變量dtoNamedClassVar。
我能夠更改dtoNamedClassCloneVar不影響dtoNamedClassVar。
Public Class dtoNamedClass
... Custom dto Property Definitions
Public Function ShallowCopy() As dtoNamedClass
Return DirectCast(Me.MemberwiseClone(), dtoNamedClass)
End Function
End Class
Dim dtoNamedClassVar As List(Of dtoNamedClass) = {get your database data}
Dim dtoNamedClassCloneVar =
(From d In Me.dtoNamedClass
Where {add clause if necessary}
Select d.ShallowCopy()).ToList
這個工作對我來說:
mySecondList = myFirstList.ToList
亞當Rackis,我不喜歡你「當然有」,因爲它都不明顯。
如果您有一個字符串變量指定給另一個字符串變量,那麼在對其中一個字符串進行更改時,您不會更改它們。他們沒有指向相同的物理記憶,所以爲什麼班級顯然很明顯?
此外,事情並不一致。在下面的情況下,你將有陣列中的同一個對象指向的所有元素(它們都結束與可變數量設置爲10:
SourceObject = New SomeClass
For i = 1 To 10
SourceObject.Number = i
ObjectArray.Add = SourceObject
Next i
BUT,下面將給你10個不同的實例:
For i = 1 To 10
SourceObject = New SomeClass
SourceObject.Number = i
ObjectArray.Add = SourceObject
Next i
顯然,對象的範圍有差別,所以都不明顯發生了什麼
是的,這對我來說總是顯得不直觀。同樣令人驚訝的是,10年後,仍然沒有任何簡單的.NET功能或方法可以進行深層克隆。 OK內存在2002年.NET出來後很珍貴,但現在呢? – 2016-04-08 01:47:52
這裏是你如何做到這一點:
'copy one object to another via reflection properties
For Each p As System.Reflection.PropertyInfo In originalobject.GetType().GetProperties()
If p.CanRead Then
clone.GetType().GetProperty(p.Name).SetValue(clone, p.GetValue(OriginalObject, Nothing))
End If
Next
謝謝!像魅力一樣工作。 – 2016-11-08 16:57:51
好的,我在這裏錯過了什麼? 「克隆沒有聲明」。 – tolsen64 2017-02-15 00:03:06
克隆是您嘗試克隆到的對象。
dim clone as new YourObjectType
你聲明那樣。
你好,歡迎來到SO。我真的不明白你的答案。您是否可以回答tolsen64對[deuan的回答](http://stackoverflow.com/a/35641516/3982001)的評論? – 2017-05-12 23:12:42
非常有趣的信息,好的。幸運的是,我設法找到了一種解決方法,但是很高興知道這一點:) – Voldemort 2011-04-06 23:23:14
@Omega,解決方法是什麼? – Max 2013-06-28 14:31:24