2010-01-07 75 views
1

我有點理解爲什麼會發生這種情況,但並不完全。我有一個SharedStatic)可變基類,聲明如下所示:通過值實例化本地變量?

Public Shared myVar As New MyObject(arg1, arg2) 

在派生類的方法,我設置像這樣的局部變量:

Dim myLocalVar As MyObject = myVar 

現在,當我執行類似myLocalVar.Property1 += value的操作,Property1中的值仍然存在於該方法的下一個調用中!我想我得到爲什麼它會發生; myVar是通過引用而不是按值設置的,但我從來沒有遇到過像這樣的事情。有沒有什麼辦法(除了我的解決方法,就是使用屬性值myVar創建一個新對象)按值創建myLocalVar

回答

3

當您創建myLocalVar時,您正在創建對同一共享對象的新引用。如果您確實需要共享實例的本地副本,則需要創建一個真實副本。

這是通過克隆實例或使用允許您創建實例副本的類型的複製構造函數完成的。然而,這並不像聽起來那麼簡單,因爲如果您正在訪問的屬性只是對同一個實例的淺拷貝引用,由於深度拷貝和淺拷貝之間的差異以及克隆或複製的實例可能會爲您創建類似的問題原始實例上的屬性正在引用。

在這種情況下,我所要做的最好的事情就是隻創建需要的共享實例部分的本地副本,而不是複製整個對象圖。這意味着創建任何類型Property1的本地副本並使用它。

+0

是的,這是我的解決方法,實際上。 「深」和「淺」複製之間有什麼區別?感謝這非常知識的答案! – Jason 2010-01-07 04:28:31

+0

淺拷貝意味着只複製對象的「頂級」屬性。深層複製將意味着複製頂層屬性並挖掘屬性的子屬性等。 – Eilon 2010-01-07 04:39:56

+0

@Jason:Brad Abrams在這裏有一個很好的解釋:http://blogs.msdn.com/brada/ archive/2003/04/09/49935.aspx「Deep-copy複製克隆對象和對象引用的所有對象,遞歸直到圖中的所有對象都被複制。非深度複製(被稱爲」淺「if只有頂級參考被複制)可能不會做任何事,或者是深層複製的一部分。「 – 2010-01-07 05:14:12