静态变量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

静态变量ASP.NET

静态字段在整个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

将值存储在当前会话中,这样每个请求都会有不同的值。