В 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 ответа:
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.