Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于ASP.NET中静态变量如何工作的简单问题?_C#_Asp.net - Fatal编程技术网

C# 关于ASP.NET中静态变量如何工作的简单问题?

C# 关于ASP.NET中静态变量如何工作的简单问题?,c#,asp.net,C#,Asp.net,我有一张显示一些信息的地图。默认情况下,地图上的标签处于禁用状态。有一个图像按钮,当您关闭标签时,该按钮具有与之关联的已关闭图像;当您打开标签时,该按钮具有与之关联的已打开图像。我有代码工作,但我想要一个更好的理由来解释为什么它是这样工作的。下面是一段代码 如果我声明一个类级布尔变量showLabels,如下所示: private bool showLabels = false; 然后有以下代码: if(showLabels == false) { showLabels = true;

我有一张显示一些信息的地图。默认情况下,地图上的标签处于禁用状态。有一个图像按钮,当您关闭标签时,该按钮具有与之关联的已关闭图像;当您打开标签时,该按钮具有与之关联的已打开图像。我有代码工作,但我想要一个更好的理由来解释为什么它是这样工作的。下面是一段代码

如果我声明一个类级布尔变量showLabels,如下所示:

private bool showLabels = false;
然后有以下代码:

if(showLabels == false)
{
    showLabels = true;
    imgShowLabels.ImageUrl = "label-on.png";
}
else
{
    showLabels = false;
    imgShowLabels.ImageUrl = "label-off.png";
}
当我运行它时,地图会显示默认情况下未显示的标签。当我单击Show Labels按钮时,变量showLabels变为true,图像变为label-on.png,但当我再次单击它时,showLabels变量重置为false,因此不会发生任何事情

因此,我所做的是将其从:

private bool showLabels = false;

它是这样工作的

这是处理这种情况的正确方法吗

在类级别中,我放置了以下属性:

public bool ShowLabels
{
    get { return (bool)ViewState["ShowLabels"]; }
    set { ViewState["ShowLabels"] = value; }
}
在if(!Page.IsPostBack)中,我将ShowLabels设置为false

那么在我的if声明中,我正在做:

if(ShowLabels == false)
{
    ShowLabels = true;
    imgShowLabels.ImageUrl = "label-on.png";
}
else
{
    ShowLabels = false;
    imgShowLabels.ImageUrl = "label-off.png";
}

但是ShowLabels总是错误的,我认为通过属性ShowLabels设置ViewState,它将保留其值。

不确定ASP,但作为一种样式,它具有

if(showLabels == false)
不太可读。你应该使用

if(!showLabels)

相反

对ASP不太清楚,但作为一种风格

if(showLabels == false)
不太可读。你应该使用

if(!showLabels)

相反

请记住,每次回发(出于任何原因,包括只是为了处理服务器事件)时,您都在使用页面类的全新实例。旧的一个已经死了,并且不见了——当页面最后一次呈现到浏览器上时,它就可以一次性使用了

当您将其更改为静态时,它“起作用”,因为静态变量与任何特定实例都没有关联。然而,当您开始在更广泛的环境中测试时,我怀疑您会感到惊讶。由于该站点页面的所有用户都在同一AppDomain中,因此他们都将设置相同的showLabels变量

要解决此问题,您需要将此变量存储在某个仅适用于该用户的位置。选项包括ViewState、会话、数据库或其他一些长期存储机制。我的偏好倾向于数据库(可能使用sql server的ASP.Net个性化提供程序),因为用户每次访问您的站点时都可能希望您记住这一点


那么:

ShowLabels = !ShowLabels;
imgShowLabels.ImageUrl = string.Format("label-{0}.png", (ShowLabels)?"on":"off");

请记住,每次回发(出于任何原因,包括只是为了处理服务器事件)时,您都在使用一个全新的page类实例。旧的一个已经死了,并且不见了——当页面最后一次呈现到浏览器上时,它就可以一次性使用了

当您将其更改为静态时,它“起作用”,因为静态变量与任何特定实例都没有关联。然而,当您开始在更广泛的环境中测试时,我怀疑您会感到惊讶。由于该站点页面的所有用户都在同一AppDomain中,因此他们都将设置相同的showLabels变量

要解决此问题,您需要将此变量存储在某个仅适用于该用户的位置。选项包括ViewState、会话、数据库或其他一些长期存储机制。我的偏好倾向于数据库(可能使用sql server的ASP.Net个性化提供程序),因为用户每次访问您的站点时都可能希望您记住这一点


那么:

ShowLabels = !ShowLabels;
imgShowLabels.ImageUrl = string.Format("label-{0}.png", (ShowLabels)?"on":"off");

否,因为这是一个多线程多用户应用程序,所有web应用程序通常都是这样。如果将变量设置为static,则当其启用为true时,实际上是为站点上的每个用户打开标签

既然您说这是ASP.NET,您可能想将其存储在ViewState中。您可以通过以下方式完成此操作:

ViewState["ShowLabels"] = false;
你可以把它包装成一个属性

public bool ShowLabels { 
    get { return (bool)ViewState["ShowLabels"]; }
    set { ViewState["ShowLabels"] = value; }
}
希望这有帮助。ViewState的替代方法是SessionState,您可以对其使用相同的构造

public bool ShowLabels { 
    get { return (bool)Session["ShowLabels"]; }
    set { Session["ShowLabels"] = value; }
}

否,因为这是一个多线程多用户应用程序,所有web应用程序通常都是这样。如果将变量设置为static,则当其启用为true时,实际上是为站点上的每个用户打开标签

既然您说这是ASP.NET,您可能想将其存储在ViewState中。您可以通过以下方式完成此操作:

ViewState["ShowLabels"] = false;
你可以把它包装成一个属性

public bool ShowLabels { 
    get { return (bool)ViewState["ShowLabels"]; }
    set { ViewState["ShowLabels"] = value; }
}
希望这有帮助。ViewState的替代方法是SessionState,您可以对其使用相同的构造

public bool ShowLabels { 
    get { return (bool)Session["ShowLabels"]; }
    set { Session["ShowLabels"] = value; }
}

Joel一针见血,但我要补充的是,您可能应该将功能放在客户端上,以确保静态变量不会意外清理

我会这样做:

<a href="[YourPageHere.aspx]?showLabel=[togglethisvalue]>Show Labels</a>


对于Webforms。然后可以将其作为查询变量处理。这样你就需要有正确的价值观。在客户端有很多其他的方法可以做到这一点。为了简单起见,我使用了查询变量方法,但这可能不适用于您的页面变得更健壮的情况。

Joel一针见血,但我想补充一点,您可能应该做的是将功能放在客户端上,以确保不会意外清理静态变量

我会这样做:

<a href="[YourPageHere.aspx]?showLabel=[togglethisvalue]>Show Labels</a>


对于Webforms。然后可以将其作为查询变量处理。这样你就需要有正确的价值观。在客户端有很多其他的方法可以做到这一点。为了简单起见,我使用了查询变量的方法,但这可能不适用于您的页面变得更健壮。

或者更好:颠倒顺序,只需说if(showLabels),我同意如果您需要在“if..else”中测试true和false,那么肯定应该先进行(如Joel所建议的)。但是,对我来说,仅使用“==false”测试false要比使用“!”更容易理解@凯文,我真的同意这一点。你