每个用户的静态对象是否唯一?
我有一个类似这样的.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个规则
- 每个
AppDomain
有一个静态变量存储位置 - generics类型的每个唯一实例都会创建一个不同的静态变量。
我发现很难写出第二条规则,而不会有任何模糊的独特性 。 基本上MyType
和MyType
每个都有不同的静态变量。 而MyType
和MyType
共享同一个。
用户访问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