views:

826

answers:

3

I'm having a bit of a weird problem to do with scope of variables. I've declared a variable in the following way:

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

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

And this works fine on the workings of my page. However when two users are using the same page I'm finding that I'm getting cross over. If one user were to set the variable to 5 and the other use then accessed that variable it would be set to 5. How can I set the variable so it's only accessible to the user who originally set it?

+2  A: 

Remove the static declaration:

protected int MyGlobalVariable;

More on Static variables

roryf
A: 

Do not ever use STATIC variables in your pages.

Static variables use same memory address internally. So all users will get same value stored.

Well, if you use this in need of 'public' varilables. Then you will need to use some tricks like viewstate or session.

NinethSense
"Do not ever use STATIC variables"... unless thats the intended behaviour...
Eoin Campbell
noob question: how to use public variables?
Magnetic_dud
+3  A: 

If you declare MyGlobalVariable as static, then only one instance of it will exist for all instances of the class, so as you said, multiple users, on multiple instances of teh same page will be accessing the same value.

either declare the int without the static modifier or if you need it to persist for that user, consider using Viewstate (for page scope) or Session (for session scope)

e.g.

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

or

protected int MyGlobalVariable
{
    get
    {
        return Session["MyGlobalVariable"] != null ? Convert.ToInt32(Session["MyGlobalVariable"] : 0;
    }
    set
    {
        Session["MyGlobalVariable"] = value;
    }
}
Eoin Campbell
Thanks Batman, that was just the elegant solution I was looking for
Jack Mills