2

いくつかの基本を学ぶ時間です。

以下のコードを見てください。

  protected void Button1_Click(object sender, EventArgs e)
 {

    List<string> a;
    if(Session["data"] == null)
    {
        a = new List<string>();
        a.Add("abc");
        a.Add("def");
        a.Add("ghi");

        Session["data"] = a;
    }
    else
    {
        a = (Session["data"] as List<string>);
    }
    a.Add("jkl");
    foreach (string s in a)
    {
        lblTest.Text += s + "<br />";
    }
}

私がセッションで何かをしているコードビハインドには他にどこにもありません。このコードの予想される動作は、最初の実行 (クリック) セッションで "a" への参照を保持することです。ただし、上記の関数では「a」にはローカル スコープがあるため、どこかで「a」の値をセッションにコピーする必要があります。それはどこで起こりますか?関数が実行される前に発生しますか?それ以外の場所 (つまり、ページのアンロード、検証、レンダリング) ではリスト "a" が使用できないためです。では、割り当てられた、または参照された値は、いつ、どこでセッションに保存されるのでしょうか?

4

2 に答える 2

2

では、割り当てられた、または参照された値は、いつ、どこでセッションに保存されるのでしょうか?

ここ:

Session["data"] = a;

2 回目の実行では、セッションから を取得し、それに要素を追加します。ただし、List<string>は参照型であるため、aとの両方Session["data"]がメモリ内の同じ場所を指しているため、要素を追加するaと基本的に変更されるため、もう一度Session["data"]呼び出す必要はありません。Session["data"] = a

于 2012-06-26T10:06:40.843 に答える
1

aのインスタンスへの参照ですList<string>。を割り当てるSession["data"] = aと、 の同じインスタンスへの参照も含まれるようになりましたList<string>。したがって、範囲外になるという事実にもかかわらず、a少なくとも 1 つの参照が残っているため、そのリスト インスタンスは残ります。アクセスSession["data"]は、セッションから削除される (または別のものに置き換えられる) まで、同じインスタンスへの参照を返し続けます。

于 2012-06-26T10:06:57.817 に答える