2012-03-30 5 views
5

Я взял на себя содержание веб-сайта (ASP.NET VB) и на одной конкретной странице я заметил код нижеОбщая общая переменная между пользователями?

Inherits System.Web.UI.Page 

Public Shared UserNumber As String 

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 

    UserNumber = Session("UserNumber") 

    ... 

End Sub 

Мой вопрос, является ли переменная UserNumber можно получить или изменить любой другой чем текущий?

Большое спасибо

+0

Да; как переменная «Shared», она доступна для всех экземпляров ... поэтому все пользователи приложения, которые работают в одном и том же процессе. –

ответ

9

A Shared переменная такая же, как переменная static в C#.

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

Глядя на имя переменной, я полагаю, вы должны были бы удалить этот Shared


Вы подаете на Session значение переменной к Shared String на Page_Init.

Поэтому каждый раз, когда пользователь загружает страницу, их переменная сеанса переопределяет текущее значение.


Если вы не используете эту переменную вне этого класса, то я бы рекомендовал изменить его на:

Protected UserNumber As String 
+0

Итак, если код просто изменен на Public UserNumber As String Эта переменная доступна только для текущего пользователя? – BugLover

+0

+1 Не мог бы лучше поставить себя;) – musefan

+0

@BugLover Это правильно – Curt

4

EDIT Мой первоначальный ответ был неверным. Повторное повторение ...

Технически, как указано в @Curt, переменная Shared делится между экземплярами класса.

Однако, с кодом как есть, менее вероятно, что значение будет использоваться совместно с пользователями, так как оно установлено для локальной копии каждого пользователя значения в их сеансе в Page_Init.

Существует возможный «состояние гонки», где после того, как общая переменная UserNumber инициализирован в Page_Init, а другой пользователь отправляет запрос, который обновляет значение этой переменной из своей сессии первый пользователь будет видеть второй пользователя стоимость. то есть пользователи могут видеть значения других пользователей для одновременных запросов.

Вместо этого я рекомендую использовать ReadOnly неразделяемого свойства для получения значения из сессии один раз:

Private mUserNumber As String 
Public ReadOnly Property UserNumber As String 
     Get 
      If String.IsNullOrEmpty(mUserNumber) Then 
       mUserNumber = Session("UserNumber") 
      End If 
      Return mUserNumber 
     End Get 
End Property 

Это использует шаблон под названием «Ленивая загрузка», который я использую в режиме только для чтения свойств много на страницах для повышения производительности и удобочитаемости кода.

+0

Спасибо за ответы, но я вижу противоречивые ответы Я понимаю, что сеанс хранится отдельно между пользователями, но мой вопрос заключается в том, сможет ли пользователь B выполнить значение переменной UserNumber для пользователя A? – BugLover

+0

Словарь 'Session', но как насчет' Shared String'? Разве разные переменные сеанса не будут обновлять одну и ту же общую переменную? – Curt

+0

-1.Вы имеете право на словарь 'Session', но * переменную UserNumber * (вот о чем идет речь, а не' Session («UserNumber»)) * * * совместно используется всеми пользователями. – Heinzi

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