【问题标题】:Scope Of ASP.Net VariablesASP.Net 变量的范围
【发布时间】:2009-04-30 10:00:09
【问题描述】:
我遇到了一个与变量范围有关的奇怪问题。我已经通过以下方式声明了一个变量:
public partial class MyClass: System.Web.UI.Page
{
protected static int MyGlobalVariable;
protected void MyFunction()
{
MyGlobalVariable = 1;
}
}
这在我的页面上运行良好。但是,当两个用户使用同一个页面时,我发现我正在越界。如果一个用户将变量设置为 5,而另一个用户访问了该变量,它将被设置为 5。如何设置该变量,以便它只能由最初设置它的用户访问?
【问题讨论】:
标签:
asp.net
variables
scope
【解决方案1】:
如果您将MyGlobalVariable 声明为静态,则该类的所有实例将仅存在一个实例,因此正如您所说,同一页面的多个实例上的多个用户将访问相同的值。
要么声明不带static 修饰符的int,或者如果您需要它为该用户保留,请考虑使用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;
}
}
【解决方案3】:
永远不要在您的页面中使用 STATIC 变量。
静态变量在内部使用相同的内存地址。所以所有用户都将获得相同的存储值。
好吧,如果您使用它需要“公共”变量。然后,您将需要使用一些技巧,例如视图状态或会话。