0

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;
    }

subjectAreaID の値はまだ 0 であるべきだと思っていましたが、明らかに何かを誤解しています。ruleInEditにオブジェクトを書き戻すと、.Net はどのように (またはなぜ) オブジェクトを自動的に更新しますかSession?

  • 元のメソッドFooでは、更新されたオブジェクトとプロパティを取得するために、ruleInEdit に強制的にセッションを再度読み取らせる必要はありませんか?
  • このオブジェクトは、初期化の方法によってセッション スコープに関連付けられていますか?
4

2 に答える 2

5

オブジェクトをセッション コレクションに書き戻す必要はありません。

オブジェクトのインスタンスは 1 つだけで、セッション コレクションから読み取るときにコピーされません。オブジェクトに加えた変更は、同じインスタンス (つまり、同じセッション) を参照するすべてのコードに即座に表示されます。

セッション コレクションに格納されるのは、オブジェクトへの単なる参照です。オブジェクト自体はヒープに格納されます。

于 2012-08-22T19:22:09.720 に答える
3

InProc (デフォルト) セッション ストレージを使用している場合、シリアル化は発生しません。参照型であるカスタムクラスによる操作です。したがって、メソッド Validate がセッションからオブジェクトを取得するとき、実際には、元のオブジェクトを変更しているポインターにすぎません。つまり、タイプ RmRule のオブジェクトは、Foo メソッドと Validate メソッドで同じです。

たとえば、SQL サーバーにセッションを保存するようにアプリケーション設定を切り替えた後の動作が期待されます。

于 2012-08-22T19:28:29.950 に答える