I'm having problems with retrieving multiple instances of a session variable from an InProc session state.
In the following code I persist a simple BusinessObject into a session variable on 开发者_StackOverflow中文版the Page_Load event. On the click of a button I try to retrieve the object back into 2 new declared instances of the same BusinessObject.
All works great until I change one of the properties in the first instance, it changes the second instance as well.
Is this normal behaviour? I would have thought as these were new instances they wouldn’t demonstrate static behaviour?
Any ideas where I'm going wrong?
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
your BO1 and BO2 are the same object BO1 is a name that references some area in memory; BO2 is another name that references the SAME area of memory; Session("BO") references the SAME area of memory.
To truly create different objects BO1 and BO2, you should create a copy of the object - for example implement Clone() method in your business object class.
You're instantiating two new objects, and then setting each of them to be the same object (i.e. the one from session), so your behaviour is exactly as you would expect.
Incidentally, you may wish to consider how your page would perform if a user opens two of these pages in a tab - will your business object in the session then cause you some problems?
精彩评论