我对Asp.net页面中静态变量的使用存在疑问。
我有一页说UserDetails.aspx。 在这个页面中,我有一个静态变量来存储特定于用户的一些数据。那么,这个变量是否会在多个用户之间共享,或者是否会为每个用户创建一个单独的变量?
public partial class UserDetails : System.Web.UI.Page
{
static int numberOfReviews=0;
protected void Page_Load(object sender, EventArgs e)
{
numberOfReviews= GetReviews();
}
}
此处, numberOfReviews 会特定于每个用户还是会被分享?
numberOfReviews
答案 0 :(得分:24)
应用程序范围:具有应用程序范围的变量在整个应用程序中都可用,即跨所有页面的应用程序的所有用户。
会话范围:当许多用户连接到您的网站时,每个用户都会有一个单独的会话(与应用程序识别的用户身份相关联。)当变量具有会话时范围它将为每个会话提供新实例,即使用户正在访问同一页面。会话变量实例可用于该会话的所有页面。
页面范围:当您在页面上有一个实例变量时,它仅特定于该页面而且仅限该会话。
静态变量有Application scope
。该应用程序的所有用户将在您的案例中共享相同的变量实例。
请注意,虽然静态变量在app域中有一个实例。因此,如果您将应用程序部署在负载平衡的Web场中,则每个应用程序域将具有该变量的单独实例。这可能会给你不正确的结果。
基于此,你应该决定变量的范围.IMO,使用静态变量是一种代码气味,应该不鼓励。
答案 1 :(得分:18)
静态变量范围是应用程序范围的。 numberOfReviews
将在所有用户之间共享。您需要使用Session
来存储每个用户,因此可以在所有页面中访问它。另一方面,如果您只是在特定页面上需要它,可以将其保存在ViewState
中,并可以在回发中获取。
答案 2 :(得分:2)
它将像Application [“some_id”]一样在应用程序范围内共享。
为此使用普通的int变量。
答案 3 :(得分:1)
正如Adeel已经提到的:静态(或在VB.Net中共享)变量是应用程序范围的。这意味着它们对于每个用户都是相同的,并且在网络服务器停止或上次会话放弃之前一直存在。
您可以使用Session存储属于当前用户的变量。
如果您需要访问其他用户的numberOfReviews(例如管理员或统计数据),您可以使用数据库,asp.net-cache或以userid为键的简单静态字典。
答案 4 :(得分:0)
通常要使用数据库
Data Table
userId | UserViews
你也可以使用静态变量,因为在这种情况下你必须在应用程序状态中存储数据,问题是,只要你重新启动,你的整个数据就会被重置。