静态属性/字段在 Web 应用程序中很好,只要它们用于共享数据,这些数据可以在任何时候可接受地消失,例如当应用程序池回收时。
也就是说,它们的值确实在 ASP.Net 应用程序内部共享,除非它们具有隔离的支持机制,例如Session
.
例子
public static int UserId = 10; // BAD! everyone gets/sets this field's value
// BAD! everyone gets/sets this property's implicit backing value
public static int UserId {
get;
set;
}
// This case is fine; just a shortcut to avoid instantiating an object.
// The backing value is segregated by other means, in this case, Session.
public static int UserId{
get{
return (int)HttpContext.Current.Session["UserId"];
}
}
// While I would question doing work inside a property getter, the fact that
// it is static won't cause an issue; every call retrieves data from a
// database, not from a single memory location.
public static int UserId{
get{
// return some value from database
}
}
在流量很大之前,您可能看不到问题。假设页面检索到一个值,将其放入静态变量中,使用一次,然后完成执行。如果页面执行速度很快,则只有非常小的(但很危险!)重叠窗口,除非时机正确和/或流量足够高,否则您可能看不到。
这可能会导致难以诊断的错误,因为它们取决于时间,并且您在本地机器上自行测试时可能不会看到它们。