В asp.net жизненный цикл страницы, когда устанавливается сеанс?


Время изучить некоторые основы.

Посмотрите на код ниже:

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

Больше нигде в codebehind я ничего не делаю с сессиями. Ожидаемое поведение этого кода заключается в том, что при первом запуске(щелчке) сеанс будет содержать ссылку на "a". Но "a "имеет локальную область действия в приведенной выше функции, поэтому где-то значение" a " должно быть скопировано в сеанс. Где это происходит? Происходит ли это до выполнения функции, потому что в любом другом месте это происходит(т. е. Выгрузка страницы, проверка, рендеринг) список " а " будет недоступен. Итак, когда и где присваиваемое или упоминаемое значение сохраняется в сеансе?

2 2

2 ответа:

a это ссылка на ваш экземпляр List<string>. Когда вы присваиваете Session["data"] = a, он теперь также имеет ссылку на тот же самый экземпляр List<string>. Таким образом, несмотря на то, что a выходит за пределы области видимости, этот экземпляр списка остается, так как по крайней мере одна ссылка остается. Обращение к Session["data"] будет продолжать возвращать ссылку на тот же экземпляр, пока он не будет удален из сеанса (или заменен чем-то другим).

Итак, когда и где присваиваемое или упоминаемое значение сохраняется в сеансе?

Здесь:

Session["data"] = a;

Во втором запуске вы извлекаете a из сеанса и добавляете к нему элемент. Но поскольку List<string> является ссылочным типом, и a, и Session["data"] теперь указывают на одно и то же место в памяти, поэтому при добавлении элемента в a вы в основном модифицируете Session["data"], поэтому вам не нужно снова вызывать Session["data"] = a.