2010-01-07 71 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