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

我有一个类似这样的.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的值?

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

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

  1. 每个AppDomain有一个静态变量存储位置
  2. generics类型的每个唯一实例都会创建一个不同的静态变量。

我发现很难写出第二条规则,而不会有任何模糊的独特性 。 基本上MyTypeMyType每个都有不同的静态变量。 而MyTypeMyType共享同一个。

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

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

 Session["examKey"] = theExam; 

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

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

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

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

一些一般性的建议

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

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

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