Вопрос

У меня возникла немного странная проблема, связанная с областью действия переменных.Я объявил переменную следующим образом:

public partial class MyClass: System.Web.UI.Page
{
    protected static int MyGlobalVariable;

    protected void MyFunction()
    {
        MyGlobalVariable = 1;
    }
}

И это прекрасно работает на моей странице.Однако, когда два пользователя используют одну и ту же страницу, я обнаруживаю, что начинаю пересекаться.Если бы один пользователь установил переменной значение 5, а другой пользователь затем обратился к этой переменной, ей было бы присвоено значение 5.Как я могу установить переменную так, чтобы она была доступна только тому пользователю, который изначально ее установил?

Это было полезно?

Решение

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

либо объявить int без static модификатор или, если вам нужно, чтобы он сохранялся для этого пользователя, рассмотрите возможность использования Viewstate (для области видимости страницы) или Session (для области действия сеанса)

например ,

protected int MyGlobalVariable
{
    get
    {
        return ViewState["MyGlobalVariable"] != null ? Convert.ToInt32(ViewState["MyGlobalVariable"] : 0;
    }
    set
    {
        ViewState["MyGlobalVariable"] = value;
    }
}

или

protected int MyGlobalVariable
{
    get
    {
        return Session["MyGlobalVariable"] != null ? Convert.ToInt32(Session["MyGlobalVariable"] : 0;
    }
    set
    {
        Session["MyGlobalVariable"] = value;
    }
}

Другие советы

Удалите статическое объявление:

protected int MyGlobalVariable;

Подробнее о Статические переменные

Никогда не используйте статические переменные на своих страницах.

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

Ну, если вы используете это, когда вам нужны "общедоступные" переменные.Затем вам нужно будет использовать некоторые приемы, такие как viewstate или session.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top