C# .Net更新会话对象的副作用

C# .Net更新会话对象的副作用,c#,session,webforms,C#,Session,Webforms,我在.NETWebForms项目中使用了一些奇怪的(至少对我来说)功能,包括Session对象。我在会话中传递对象,并且没有使用任何全局变量。我的方法如下所述: private int Foo() { RmRule ruleInEdit = (RmRule)Session["ruleInEdit"]; //here ruleInEdit.subjectAreaID=0 bool isValid = Validate(); if (isValid)

我在.NETWebForms项目中使用了一些奇怪的(至少对我来说)功能,包括
Session
对象。我在
会话中传递对象,并且没有使用任何
全局变量。我的方法如下所述:

 private int Foo()
 {
     RmRule ruleInEdit = (RmRule)Session["ruleInEdit"];
     //here ruleInEdit.subjectAreaID=0
     bool isValid = Validate();
     if (isValid)
     {
        //do some stuff
        //here ruleInEdit.subjectAreaID is 10 instead of 0
        //the Validate function modified the ruleInEdit object 
      }

    //other code
  }

   private bool Validate()
   {
       bool isValid;
       //check some stuff
       RmRule rule = (RmRule)Session["ruleInEdit"];
       rule.subjectAreaID = 10;
       Session["ruleInEdit"] = rule;
       return isValid;
    }
我认为subjectAreaID的值仍然应该是0,但显然我误解了什么。当我将对象写回
会话时,.Net如何(或为什么)自动更新
ruleInEdit
对象

  • 在原始方法
    Foo
    中,我是否应该强制ruleInEdit再次读取会话以获取更新的对象和属性
  • 这个对象与会话作用域绑定是因为我初始化它的方式吗
      不必将对象写回会话集合,它永远不会离开

      对象只有一个实例,从会话集合中读取时不会复制它。您对对象所做的任何更改都会立即对查看同一实例(即同一会话)的所有代码可见

      会话集合中存储的只是对对象的引用。对象本身存储在堆上。

      使用InProc(默认)会话存储时,不会发生序列化。您正在通过自定义类执行操作,该类是引用类型。所以,当您的方法Validate从会话中检索对象时,实际上它只是一个指针,您正在更改原始对象。 换句话说,RmRule类型的对象在Foo和Validate方法中是相同的


      例如,在将应用程序设置切换到SQL server中存储会话后,您可能会出现预期的行为。

      +0。未提及进程内/进程外差异。