C# 静态变量问题
我对静态变量有问题。我的控制器的部分组织结构如下:C# 静态变量问题,c#,asp.net-mvc,C#,Asp.net Mvc,我对静态变量有问题。我的控制器的部分组织结构如下: namespace MyApp.Controllers { public class DevicesController : Controller { static int some_var = 0; [AcceptVerbs(HttpVerbs.Post)] public ActionResult SetValue(int temp
namespace MyApp.Controllers
{
public class DevicesController : Controller
{
static int some_var = 0;
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SetValue(int temp){
some_var = temp;
return RedirectToAction("DisplayValue");
}
[Authorize]
public ActionResult DisplayValue(){
....
return View(some_object);
}
}
}
当多个用户同时使用此视图时会出现问题。所有用户使用相同的静态变量并更改其值。如何解决这个问题?将其作为私有实例变量,而不是静态变量 如果需要维护每个用户的计数(但仅针对给定会话),则可以执行以下操作:
if (Session["Count"] == null)
Session["Count"] = 0;
Session["Count"] = (int)Session["Count"] + MyNewValue;
如果希望计数在整个会话中保持不变,则可以将其保持到数据库中。静态变量(和属性)将在该类型的所有实例之间共享,在本例中为控制器。重新启动应用程序池时,该值将丢失
如果需要在请求之间为特定用户保留该值,则可能需要将其移动到会话或类似的位置
如果您只需要在当前请求期间保留该值,那么私有变量就足够了。您可以使用
HttpContext.Current.Session["some_var"]
这会有所帮助,而不是使用一些变量。这将为记录的用户保留一个会话,您可以使用HttpContext.Current静态访问它
namespace MyApp.Controllers
{
public class DevicesController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SetValue(int temp){
HttpContext.Current.Session["some_var"] = temp;
return RedirectToAction("DisplayValue");
}
[Authorize]
public ActionResult DisplayValue(){
....
return View((int)HttpContext.Current.Session["some_var"]);
}
}
}
类变量和对象变量之间有一个重要的区别。静态变量是类变量,这意味着从一个类实例化的所有对象共享同一个变量,因此对象中该静态变量的更改也会更改同一类的其他对象。 但为每个实例化对象创建一个非静态变量(对象变量),所以更改不会影响其他对象 但问题不是在这两者之间做出选择,因为你的需求不同。您需要为每个用户保留一个变量。正如其他人所说,您必须使用会话变量
但是我认为您应该阅读有关对象变量和类变量的内容。您的整个ASP.NET MVC应用程序运行在一个
AppDomain
中,即应用程序加上为所有用户提供的所有请求,一切
创建静态变量时,将声明单个实例并使其可用于整个AppDomain,来自每个用户的每个请求都将看到相同的值
实例变量(只需删除“static”一词)特定于它所在的特定对象的实例。在这种情况下,对象是控制器的实例,因此作为实例变量的变量将仅针对该控制器对象。ASP.NET运行时将为其服务的每个请求创建控制器实例,然后在其处理请求后丢弃该控制器对象。因此,如果删除静态字,变量将仅在该请求期间保留,然后消失
正如其他海报所说,您需要的是会话状态。会话状态持续会话的持续时间,如浏览您的站点的用户,并且特定于每个用户。所以,如果将该变量存储在会话状态中,则每个用户的变量都会不同
问题是当用户离开你的网站时,会话状态消失了,所以如果你需要它停留更长的时间,那么你应该使用数据库之类的东西
从您的评论和原始帖子中,听起来(我会尽量礼貌地说)您还没有完全掌握一些面向对象编程的习惯用法和概念。虽然会话状态本身不是一个OOP概念,但静态变量和实例变量之间的区别是。我会建议你重温这些,因为对这些概念的理解(OO编程的基础)意味着,嗯,你甚至不会问这个问题。我希望这个答案对你的理解有所帮助。静力学既不好也不坏。它们只是有一个不同的使用结构。 考虑一下你正在处理国际电话号码。 要做到这一点,您至少需要一个国家代码、国家和唯一id。您可能还需要输入IDD国家/地区转义前缀。 因此,您创建一个对象来保存所有这些内容,然后从数据库或其他方法将它们收集到一个列表中。 您需要一个下拉列表,列出用户选择的国家,然后您希望国家代码与您正在收集的任何内容相匹配。 如果将国家/地区对象列表创建为静态,则在往返服务器时,不必每次都从其备份存储重新加载列表,只需使用它填充下拉列表即可。因为这些数据永远不会改变,所以可以将其设置为静态。网站上的每个人都将使用相同的国家列表,因此,拥有一份副本并不重要。但是,您必须将用于索引列表的Id设置为非静态,以便在恢复列表上的选择时,每个人都有自己的选择,而不是显示最后一个人选择的全局静态选择。 将您的模型非静态country_code_id设置为使用列表中选定的id,然后在准备更新数据时,使用模型country_code_id在country对象列表中查找country_代码以返回用于更新的country_代码
正如我所说,静态既不是好的也不是坏的,它们只是有不同的用法。如果我将其设置为私有,则会丢失
某些变量的值。
。听起来您希望维护每个用户的值,因此应该将其保留到会话中,或者到一个具有相关用户ID的数据库。在这里我可以找到这样的示例:我需要该值在特定用户的请求之间持久化,任何在sessionsOgnjen中使用静态变量的示例:整个会话对象(HttpContext.Current.session)都是静态的。请参阅Akash的回复或在ASP.NET中查找如何使用会话。:)在哪里可以找到将值保存到会话状态的任何示例在使用代码时出现此错误:“System.Web.HttpContextBase”不包含“Current”的定义,并且没有接受第一个值的扩展方法“Current”