应用程序变量总是引用我的对象,我希望它保留一个"副本"

Lou*_*der 2 .net c# vb.net asp.net

也许这是漫长的一天,但我无法弄清楚这一点.

我从WCF检索一个大的自定义对象,并将其存储在一个应用程序变量中.每20分钟发生一次.

对于每个Web用户,我正在检查此应用程序变量的存在和超时,如果需要,请重新查询我的wcf并构建一个新对象,并将其重新存储在应用程序变量中.

这一切都很好.

现在,我试图"复制"这个"主"对象,修改它,并将其存储在会话变量中,并在整个会话生命周期中根据需要进行修改.(修改会话变量).

每次我修改会话对象时,应用程序变量中的对象都会被修改.

application("mastervar") = object from wcf (obejct type - xcustomclass)

dim mynewobject as new xcustomclass
mynewobject = application("mastervar")
Run Code Online (Sandbox Code Playgroud)

*修改mynewobject,也修改应用程序("mastervar")

我试过了:

session("mynewSessionVar") = application("mastervar")
mynewobject = session("mynewSessionVar")
Run Code Online (Sandbox Code Playgroud)

修改mynewobject,修改应用程序("mastervar")

我试过了:

使用for循环手动将mastervar对象中的所有属性复制到新对象.

mycustomobject = new xcustomclass
mycustomobjectObject as new xcustomclass.object

mymasterobject = application("mastervar")

for each object in mymasterobject.objectslist
mycustomobjectObject = new xcustomclass.object

with mycustomobjectObject
  .property = object.property
end with

mycustomobject.objectlist.add(mycustomobjectObject)

next
Run Code Online (Sandbox Code Playgroud)

同样的事情,修改mycustomobject,也修改了应用程序("mastervar")

正如我所说,也许这是一个漫长的一天,但我已经对这个问题多了几个小时......

编辑

 Private Function copy_fresh_units(unitsFromWcf As WebResortUnits) As WebResortUnits
        Dim myFreshUnits As New WebResortUnits
        Dim myFreshUnit As WebResortUnits.qbunit

        For Each Unit In unitsFromWcf.resortUnits
            myFreshUnit = New WebResortUnits.qbunit

            With myFreshUnit

                ' .Availability = Unit.Availability
                .mapDetails = Unit.mapDetails

            End With

          myFreshUnits.resortUnits.Add(Unit)

         Next

return myFreshUnits

End Function
Run Code Online (Sandbox Code Playgroud)

修改myfreshUnits中的availability属性,它仍然更新app var.我看过参考和价值类型,这绝对是我的问题.但考虑到这个编辑,我知道我错过了什么,它是什么,我不确定...... :-)

Kev*_*vin 5

您正在创建对对象的新引用,然后修改您引用的对象并期望您的两个引用不是同一个对象?

听起来你真正想做的就是克隆对象或对对象进行深度复制.

如果这些是自定义对象,您将需要自定义代码来克隆它们.

克隆对象时,请确保创建新对象并从旧对象设置该新对象上的所有值类型.然后浏览并克隆所有引用类型,并在克隆上设置引用属性以指向您创建的属性的克隆.

编辑:解决您的更新

问题仍然是......你复制的所有东西显然都是一种参考类型而且它没有被克隆.因此,当您编辑任一引用时,它只存在一个对象,它会更改对象.

编辑2:序列化将帮助您

在内存中序列化和反序列化基础对象是克隆它的简单方法.我通常编写一个自定义克隆方法来序列化/反序列化对象.这样你就有了一个你总是会调用的Clone()方法,并且你需要的任何自定义代码都无法通过序列化/反序列化来处理,你可以在该方法中处理.

  • 在花费更多时间之前,你真的需要研究参考类型和价值类型.该行代码将您的新对象设置为应用程序变量的相同引用.它链接它们,以便对"mymasterobject"或"application("mastervar")`的更改将对同一个引用进行更改,并反映在任一变量中. (2认同)