.Net更新Session对象的副作用

Ron*_*del 0 c# session webforms

Session我的.Net Webforms项目中的对象具有一些奇怪的功能(至少对我而言).我正在传递对象Sessions并且我没有使用任何global变量.我有一个描述如下的方法:

 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;
    }
Run Code Online (Sandbox Code Playgroud)

我认为subjectAreaID的值仍应为0但显然我误解了一些东西.ruleInEdit当我将对象写回时,.Net如何(或为什么)自动更新对象Session.

  • 在原始方法中Foo,我不应该强制ruleInEdit再次读取会话以获取更新的对象和属性吗?
  • 由于我初始化它的方式,此对象是否与会话范围相关联?

Guf*_*ffa 5

您不必将对象写回会话集合,它永远不会离开.

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

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