我有一个类似于此的.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的值?
答案 0 :(得分:10)
不,静态对象与登录的每个人都是相同的实例。此外,该对象不会存在于105的计算机上,而只存在于Web服务器上。
答案 1 :(得分:7)
静态变量和用户会话的生命周期是非常不同的概念。静态变量具有CLR定义的生命周期,并且基本归结为以下2个规则
AppDomain
我发现很难写出第二条规则而不会对唯一造成歧义。基本上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