Где статическая переменная работает на странице ASP.NET?

У меня было интервью сегодня, и все было очень хорошо, но потом интервьюер задал мне вопрос Где статическая переменная работает на С# - на уровне приложения или на уровне страницы.

Я не очень разбирался в этом ответе, поскольку знал только, что статические переменные хранятся в куче, и я ничего не знал о вещах, связанных с сетью.

Затем он попытался сделать меня более понятным, указав пример, что на странице я использую статическую переменную, и три пользователя обращаются к странице, одна из которых обновляет значение статической переменной. Какое значение будет видно для оставшихся двух будут отображены старые копии или обновление.

Ответы

Ответ 1

Если это не [ThreadStatic], статическая переменная будет иметь только одно значение для каждого AppDomain.

В ASP.Net каждое приложение имеет свой собственный AppDomain, поэтому статические переменные будут совместно использоваться всеми запросами в приложении. Это то, что получал интервьюер, - использование переменных static в приложениях ASP.Net - распространенная ошибка, которая может привести к таинственным ошибкам коррупции, когда сразу несколько запросов.

Ответ 2

После того, как одна страница изменит значение, остальные страницы получат обновленное значение.

Это может быть или не быть тем, что вы хотите. Вот почему статические переменные опасны в веб-программировании. Например, в приложении Winforms статическая переменная отлично работает для хранения значений, которые являются глобальными для этого процесса, так как существует, вероятно, только один процесс. Вы получаете ожидаемое поведение.

Однако в веб-приложении ваш код можно запустить несколькими потоками в том же AppDomain. Разработчики иногда удивляются, когда ценность разделяется.

Если вы хотите, чтобы значения были разными (вы обычно это делаете), вы можете принудительно использовать это, используя атрибут ThreadStatic. Различные веб-запросы находятся в разных потоках, поэтому они останутся неосведомленными друг о друге. Я никогда не использую это, так как не доверяю сборке мусора, чтобы избавиться от значения перед вызовом следующей страницы, который может повторно использовать тот же поток. Точно так же я не буду доверять статическим переменным для целенаправленного обмена значениями между потоками asp.net; используйте серверную переменную.

Ответ 3

Статические переменные в С# с ASP.NET работают на уровне приложения.

Что касается того, какое значение они получат, это зависит от того, будут ли они обращаться к переменной до или после обновления страницы статической переменной. Если они получают значение до изменения статической переменной, они будут видеть старое значение. Если они получат значение после изменения статической переменной, они получат новое значение. Статические переменные могут быть неприятными в ASP.NET, я бы предположил, что они используются только для постоянных значений или для неизменяемых классов, предназначенных только для чтения.