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;

在第二次运行中,您将从会话中检索 a 并向其添加一个元素。但是由于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超出了范围,但该列表实例仍然存在,因为至少存在一个引用。访问Session["data"]将继续返回对同一实例的引用,直到它从会话中删除(或被其他东西替换)。

于 2012-06-26T10:06:57.817 回答