静的プロパティ/フィールドは、アプリ プールのリサイクル時など、いつでも消える可能性がある共有データに使用される限り、Web アプリケーションでは問題ありません。
とはいえ、それらの値は、.NET のような分離されたバッキング メカニズムがない限り、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
}
}
トラフィックが大幅に増加するまで、問題が発生しない場合があります。ページが値を取得し、それを静的変数に入れ、一度使用してから実行を完了するとします。ページがすばやく実行される場合、タイミングが適切であるかトラフィックが十分に多い場合を除き、非常に小さな (しかし危険な!) オーバーラップ ウィンドウしか表示されない可能性があります。
これにより、診断が困難なバグが発生する可能性があります。バグはタイミングに依存しており、ローカル マシンで自分でテストした場合はおそらくバグが表示されないためです。