静态变量ASP.NET

时间:2013-04-30 15:33:32

标签: c# asp.net variables static

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

5 个答案:

答案 0 :(得分:3)

静态字段在整个AppDomain中共享。这意味着ASP.NET Web应用程序中的所有请求将使用相同的值,您必须确保该变量是线程安全的。如果这不是您想要的,请考虑以下事项:

  • 将值存储在用户会话中:HttpContext.Current.Session
  • 将值存储在请求中:HttpContext.Current.Items。这样,该值将在整个当前请求中缓存,但不会在请求之间共享。
  • 根本不存储该值。

但是,在您的情况下,您使用的是static属性。这个静态属性在你的情况下映射到HttpContext.Current.Items,这意味着每个请求自动获得自己的变量,并且不共享变量。

换句话说,您的代码是线程安全的。

答案 1 :(得分:1)

  

我不希望这个对象与另一个对象分享它的价值   请求。

你不应该把它变成静态的。

答案 2 :(得分:1)

如果要使用静态变量而不在所有请求中共享它,可以将会话变量存储在静态属性中。使用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,但正确的类型会增加可读性,可以防止异常并避免在您使用它时将其强制转换。

答案 3 :(得分:0)

有4个主服务器Dictionary对象在请求之间存储值。 应用程序 - 在所有请求和用户之间共享值。 缓存 - 在所有请求和用户之间共享值,但无需重新启动应用程序即可使其无效。 会话 - 在同一会话中的请求之间共享值,所有页面共享相同的会话对象,并且是特定于用户的。 ViewState - 在请求之间共享值,但是特定于页面和用户特定。

答案 4 :(得分:-2)

如果您希望在单个请求中获得静态优势。也就是说,只有一个请求可以访问相同的值。改为使用会话变量。

Session['variable'] = value

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