2011-04-06 18 views
8

比方說,我有一個叫創建該對象的「克隆」,而不是指向它

myFirstList 

列表,然後我想創建一個列表的副本,所以我可以做我自己的一些調整。所以我這樣做:

mySecondList = myFirstList 
mySecondList.doTweaks 

但我注意到,調整也影響myFirstList對象!我只想調整影響第二個...

而事後我會想要完全刪除mySecondList,所以我做mySecondList = Nothing,我很好,對不對?

回答

6

但我注意到,調整也 影響myFirstList對象!我只 希望調整影響第二 一個...

當然它中。這兩個變量都指向內存中的相同對象。你對這個人做的任何事情都發生在另一個人身上。

根據您的要求,您將需要執行深層克隆或淺層克隆。 This article應該給你一個更好的想法你需要做什麼

+0

非常有趣的信息,好的。幸運的是,我設法找到了一種解決方法,但是很高興知道這一點:) – Voldemort 2011-04-06 23:23:14

+2

@Omega,解決方法是什麼? – Max 2013-06-28 14:31:24

5

既然你沒有透露你存儲在你的列表中的物品的類型,我認爲這是實施IClonable的東西(否則,如果可以的話,實現IClonable,或想出一種方法克隆列表中的單個項目)。

嘗試是這樣的

mySeconmySecondList = myFirstList.[Select](Function(i) i.Clone()).ToList() 
2

亞當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 
1

這個工作對我來說:

mySecondList = myFirstList.ToList 
4

亞當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 

顯然,對象的範圍有差別,所以都不明顯發生了什麼

+0

是的,這對我來說總是顯得不直觀。同樣令人驚訝的是,10年後,仍然沒有任何簡單的.NET功能或方法可以進行深層克隆。 OK內存在2002年.NET出來後很珍貴,但現在呢? – 2016-04-08 01:47:52

3

這裏是你如何做到這一點:

'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 
+0

謝謝!像魅力一樣工作。 – 2016-11-08 16:57:51

+0

好的,我在這裏錯過了什麼? 「克隆沒有聲明」。 – tolsen64 2017-02-15 00:03:06

0

克隆是您嘗試克隆到的對象。

dim clone as new YourObjectType 

你聲明那樣。

+0

你好,歡迎來到SO。我真的不明白你的答案。您是否可以回答tolsen64對[deuan的回答](http://stackoverflow.com/a/35641516/3982001)的評論? – 2017-05-12 23:12:42