В 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
.