在ASP.NET页面中的静态变量

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

5个回答

26

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

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

页面范围: 当您在页面上具有实例变量时,它仅适用于该页面和该会话。

静态变量 具有应用程序范围。应用程序的所有用户都将共享变量实例。

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

基于此,您应该决定变量所属的范围。在我看来,使用静态变量是一种代码异味并应该被禁止使用。


我在想关于Web代码中静态变量的作用域范围,你的回答解释得非常好。感谢你的详细解释。 - PhaZ90771
太酷了,现在我知道在小的概念验证中可以使用静态变量作为样本数据,即使持久性不是很重要(而且会话也不在手边),这正是我需要的 :) - user1778770

18

静态变量的作用域是整个应用程序。numberOfReviews将在所有用户之间共享。你需要使用Session来存储每个用户的信息,以便它可以在所有页面中访问。另一方面,如果你只需要在特定页面上使用它,你可以将其保存在ViewState中,并在后续操作中获取它。


ViewState 是页面级别的,而 Session 则是“针对当前用户会话”。 - Davide Piras
@Davide:ViewState 是页面级别的,但同样重要的是它仅属于当前用户。 - Tim Schmelter

2

这将会像Application["some_id"]一样在整个应用程序中共享。

使用普通的int变量即可。


1
如Adeel所提到的:静态变量(或在VB.Net中称为共享变量)是应用程序级别的。这意味着它们对于每个用户都是相同的,并且会一直存在直到Web服务器停止或最后一个会话被放弃。
您可以使用Session来存储属于当前用户的变量。
如果您需要访问其他用户的numberOfReviews(例如作为管理员或用于统计目的),您可以使用数据库、asp.net-cache或一个简单的以用户ID为键的静态字典。

Asp.net缓存不也是全局的,因此也在用户之间共享吗?我想结合字典可以得到所需的结果。 - KingOfHypocrites
@KingOfHypocrites:恐怕我不明白。是的,缓存是应用程序范围而不是用户特定的。这就是为什么我提到他可以使用它(或数据库、静态字典等)如果他想要访问其他用户的属性(例如numberOfReviews)。由于这是一个特殊情况(例如管理员视图),使用静态/缓存对象并不那么危险。 - Tim Schmelter

0
通常使用数据库来完成这个任务。
Data Table
userId | UserViews

另外,您也可以像您所说的那样使用静态变量,在这种情况下,您必须将数据存储在应用程序状态中,但问题是,每当您重新启动时,整个数据都将被重置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接