首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索同一asp.net会话变量的多个实例时出现问题

问检索同一asp.net会话变量的多个实例时出现问题
EN

Stack Overflow用户
提问于 2010-03-16 20:39:03
回答 2查看 946关注 0票数 1

我在从InProc会话状态中检索会话变量的多个实例时遇到了问题。

在下面的代码中,我将一个简单的BusinessObject持久化到Page_Load事件的会话变量中。在单击一个按钮时,我尝试将对象检索回同一BusinessObject的两个新声明的实例中。

在我更改第一个实例中的一个属性之前,一切都很好用,它也会更改第二个实例。

这是正常行为吗?我本以为这些是新的实例,它们不会表现出静态行为?

你知道我哪里错了吗?

代码语言:javascript
复制
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then
            ' create a new instance of a business object and set a containg variable
            Dim BO As New BusinessObject
            BO.SomeVariable = "test"
            ' persist to inproc session
            Session("BO") = BO
        End If

    End Sub

    Protected Sub btnRetrieveSessionVariable_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnRetrieveSessionVariable.Click

        ' retrieve the session variable to a new instance of BusinessObject
        Dim BO1 As New BusinessObject
        If Not Session("BO") Is Nothing Then BO1 = Session("BO")

        ' retrieve the session variable to a new instance of BusinessObject
        Dim BO2 As New BusinessObject
        If Not Session("BO") Is Nothing Then BO2 = Session("BO")

        ' change the property value on the first instance
        BO1.SomeVariable = "test2"

        ' why has this changed on both instances?
        Dim strBO1Property As String = BO1.SomeVariable
        Dim strBO2Property As String = BO2.SomeVariable

    End Sub

    ' simple BusinessObject class
    Public Class BusinessObject
        Private _SomeVariable As String

        Public Property SomeVariable() As String
            Get
                Return _SomeVariable
            End Get
            Set(ByVal value As String)
                _SomeVariable = value
            End Set
        End Property
    End Class
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-16 20:43:05

BO1和BO2是同一个对象,BO1是引用内存中某个区域的名称;BO2是引用相同内存区域的另一个名称;Session("BO")引用相同内存区域。

要真正创建不同的对象BO1和BO2,您应该创建该对象的副本-例如,在业务对象类中实现Clone()方法。

票数 0
EN

Stack Overflow用户

发布于 2010-03-16 20:42:28

您正在实例化两个新对象,然后将每个对象设置为相同的对象(即session中的对象),因此您的行为完全符合您的预期。

顺便说一句,您可能希望考虑如果用户在一个选项卡中打开其中两个页面,您的页面将如何执行-会话中的业务对象是否会给您带来一些问题?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2454317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档