2010-04-26 2 views
13

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

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

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

+7

Случайные мысли, напишите им, как бы вы ответили на этот вопрос сейчас знаниями, которые вы приобрели. Одна из самых важных возможностей разработчика - знать, когда признать недостаток знаний, а затем уметь преодолеть это с помощью новых знаний. –

ответ

20

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

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

+0

Что такое AppDomain и какова его цель –

+0

http://msdn.microsoft.com/en-us/library/dah4cwez%28v=VS.100%29.aspx – SLaks

+0

@ Шкуры: Итак, вы хотите сказать, что ThreadStatic был настоящим забота интервьюера. Он хотел знать то же самое о статических переменных. В этом случае, каков будет ваш ответ. Все ли пользователи получат обновленное значение при использовании threadstatic? –

4

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

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

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

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

+0

@Patrick. Значит, статические переменные будут использовать разделяемую память, как я ожидал, но из-за многопоточности из-за того, что несколько пользователей обращаются к одной странице, они могут получать разные значения в зависимости от того, в какое время пользователи обращаются к ним? –

+0

Это правильно. Теперь это может быть *, что вы этого хотите. Я думаю, что это чаще всего происходит случайно. –

+0

Итак, это означает, что Slack в данный момент прав относительно того, что не использовать и что использовать. –

2

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

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

Смежные вопросы