按值实例化本地变量?

时间:2010-01-07 03:44:03

标签: asp.net vb.net byref byval

我有点理解为什么会这样,但并非完全如此。我有一个带有SharedStatic)变量的基类,声明如下:

Public Shared myVar As New MyObject(arg1, arg2)

在派生类的方法中,我设置了一个局部变量,如下所示:

Dim myLocalVar As MyObject = myVar

现在当我执行myLocalVar.Property1 += value之类的操作时,Property1中的值会持续到下一次调用该方法!我想我会为什么会发生这种情况; myVar是通过引用而不是按值设置的,但我以前从未遇到过这样的事情。有没有办法(除了我的解决方法只是使用myVar的属性值创建一个新对象)来按值创建myLocalVar

1 个答案:

答案 0 :(得分:3)

创建myLocalVar时,您正在创建对同一共享对象的新引用。如果您真的想要共享实例的本地副本,则需要创建一个真实副本。

这可以通过克隆实例或使用允许您创建实例副本的类型的复制构造函数来完成。这并不像听起来那么简单,但是,由于深度和浅层复制之间存在差异,如果您访问的属性只是对同一实例的浅层复制引用,则克隆或复制的实例可能会为您创建类似的问题。原始实例上的属性正在引用。

在这种情况下,我要做的最好的事情是只创建所需的共享实例部分的本地副本,而不是复制整个对象图。这意味着创建任何类型Property1的本地副本并使用它。