asp.net页面中的静态变量

时间:2011-03-07 09:01:48

标签: asp.net static-variables

我对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

5 个答案:

答案 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

你也可以使用静态变量,因为在这种情况下你必须在应用程序状态中存储数据,问题是,只要你重新启动,你的整个数据就会被重置。