静态变量ASP.NET
本文关键字:NET ASP 变量 静态 | 更新日期: 2023-09-27 18:11:45
在asp.net web应用程序中,如果我想在静态对象中存储变量,是对的吗?我不希望这个对象与另一个请求共享它的值。
public static object Objects
{
get
{
if (HttpContext.Current.Items["Objects"] != null)
return (object)HttpContext.Current.Items["Objects"];
else
{
HttpContext.Current.Items["Objects"] = new object();
return new object();
}
}
set { HttpContext.Current.Items["Objects"] = value; }
}
THX
静态字段在整个AppDomain中共享。这意味着ASP中的所有请求。NET web应用程序将使用相同的值,您必须确保该变量是线程安全的。如果这不是您想要的,请考虑以下内容:
- 在用户会话中存储值:
HttpContext.Current.Session
- 保存请求中的值:
HttpContext.Current.Items
。通过这种方式,该值在当前请求中被缓存,但不会在请求之间共享。 - 不存储任何值
然而,在您的情况下,您正在使用static
属性。在您的示例中,此静态属性映射到HttpContext.Current.Items
,这意味着每个请求自动获得自己的变量,并且变量不共享。
换句话说,你的代码是线程安全的。
我不希望这个对象与另一个对象共享它的值请求。
如果您希望使用静态变量而不希望在所有请求中共享它,您可以将会话变量存储在静态属性中。使用HttpContext.Session
访问。
public static object Objects
{
get
{
if (HttpContext.Current.Session["Objects"] != null)
return (object)HttpContext.Current.Session["Objects"];
else
{
var obj = new object();
HttpContext.Current.Session["Objects"] = obj;
return obj;
}
}
set { HttpContext.Current.Session["Objects"] = value; }
}
但是,您不应该返回object
,而是返回正确的类型,这将增加可读性,防止异常,并避免总是在使用它的地方强制转换。
有4个主要的服务器Dictionary对象用于存储请求之间的值。应用程序-在所有请求和用户之间共享值。缓存-在所有请求和用户之间共享值,但可以在不重新启动应用程序的情况下使其无效。会话-在同一会话中的请求之间共享值,所有页面共享相同的会话对象,并且是特定于用户的。ViewState -在请求之间共享值,但是是特定于页面和特定于用户的
如果您希望在单个请求中使用静态的好处。也就是说,让单个请求访问相同的值。请使用会话变量。
Session['variable'] = value
将值存储在当前会话中,这样每个请求都会有不同的值。