18

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

4

5 回答 5

26

应用程序范围:具有应用程序范围的变量在整个应用程序中都可用,即对所有页面上的应用程序的所有用户都可用。

会话范围:当许多用户连接到您的站点时,他们每个人都会有一个单独的会话(与应用程序识别的用户身份相关联)。当变量具有会话范围时,它将为每个会话都有新的实例,即使用户访问的是同一页面。会话变量实例可用于该会话的所有页面。

页面范围:当您在页面上有一个实例变量时,它仅特定于该页面和该会话。

静态变量Application scope. 在您的情况下,应用程序的所有用户都将共享相同的变量实例。

请注意,虽然静态变量在应用程序域中有一个实例。因此,如果您将应用程序部署在负载平衡的 Web 场上,则每个应用程序域都会有一个单独的变量实例。这可能会给你不正确的结果。

基于此,您应该决定您的变量应该在什么范围内。IMO,使用静态变量是一种代码味道,应该不鼓励。

于 2011-03-07T09:06:53.157 回答
18

静态变量范围是应用程序范围内的。numberOfReviews将在所有用户之间共享。您需要使用Session来存储每个用户,因此它可以在所有页面中访问。另一方面,如果您只是在特定页面上需要它,您可以将其保存ViewState并在post back中获取。

于 2011-03-07T09:04:17.407 回答
2

它将像 Application["some_id"] 一样在应用程序范围内共享。

为此使用普通的 int 变量。

于 2011-03-07T09:07:21.650 回答
1

正如 Adeel 已经提到的:静态(或在 VB.Net 中共享)变量是应用程序范围的。这意味着它们对于每个用户都是相同的,并且在网络服务器停止或最后一个会话被放弃之前一直存在。

您可以使用 Session 来存储属于当前用户的变量。

如果您需要访问其他用户的 numberOfReviews(fe 作为管理员或用于统计),您可以使用数据库、asp.net-cache 或以 userid 作为键的简单静态字典。

于 2011-03-07T09:10:48.333 回答
0

通常为此使用数据库

Data Table
userId | UserViews

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

于 2011-03-07T09:07:00.060 回答