每个用户的静态对象是否唯一?

时间:2010-09-23 21:09:27

标签: c# asp.net static object

我有一个类似于此的.net应用程序(c#)

public partial class _Default : System.Web.UI.Page
{
    #region initial variables setup

    private static exam theExam;

    #endregion


    protected void Page_Load(object sender, EventArgs e)
    {
       if(!IsPostBack)
       {
        string userid = Request.Querystring["user"].ToString();
           theExam = new exam(userid, "some values");
       }
    }
// rest of code.

现在我的问题是,如果用户105登录了一个考试实例,那么创建了一个实例,并将其分配给顶部的静态声明。如果用户204然后从另一台计算机登录,那么顶部的静态对象是否在用户105的计算机上获得204的值?

5 个答案:

答案 0 :(得分:10)

不,静态对象与登录的每个人都是相同的实例。此外,该对象不会存在于105的计算机上,而只存在于Web服务器上。

答案 1 :(得分:7)

静态变量和用户会话的生命周期是非常不同的概念。静态变量具有CLR定义的生命周期,并且基本归结为以下2个规则

  1. 每个AppDomain
  2. 的静态变量有一个存储位置
  3. 泛型类型的每个唯一实例都会创建一个不同的静态变量。
  4. 我发现很难写出第二条规则而不会对唯一造成歧义。基本上MyType<int>MyType<string>各有不同的静态变量。虽然MyType<int>MyType<int>共享相同的内容。

    用户访问Web服务器不会影响其中任何一个。

    如果您想拥有每个用户数据,请使用Session存储数据。

    Session["examKey"] = theExam;
    

答案 2 :(得分:6)

简短回答:是的,静态字段对于AppDomain是全局的,因此为一个用户执行此操作将踩到另一个用户的数据。

您可能希望使用会话存储,而不是每个用户的范围,例如

var theExam = Session["exam"] as Exam;

答案 3 :(得分:1)

每个AppDomain都有一个静态对象“实例”。所以你的问题的答案是肯定的。由于您在用户204登录时覆盖变量,因此对用户105也会显示相同的值。

一些一般性建议

  • 尽可能避免使用静态字段
  • 使用会话在用户浏览会话的上下文中存储临时信息 Session["exam"] = currentUser.Exam;
  • 使用配置文件提供程序在会话之间保留有关每个用户的信息。

答案 4 :(得分:0)

.Net中还有一个[ThreadStatic]属性,它将为每个线程创建一个静态实例。

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(VS.71).aspx