7

ASP.NET 中的静态变量今天让我措手不及。然后我吓坏了,因为这意味着要么我对网络世界中的静态变量有根本的误解,要么 ASP.NET 不像我想象的那样行事。

所以在 ASP.NET

public class MyClass {
    public static bool myVar = true;    
}

如果 ASPUserA 设置MyClass.myVar = false系统上的每个其他用户都会经历这些变化。所以, ASPUserB 会有myVar= false。我的来源: http ://www.foliotek.com/devblog/avoid-static-variables-in-asp-net/

class MyClassPHP {
    public static $myVar = false;
}

如果 PHPUserA 设置MyClass::$myVar = true这是否意味着系统上的每个用户都会经历这些变化???

谢谢你。


经过进一步研究,我这样做了;

class MyClassPHP {
    public static $myVar = 0;
}

然后我让访问页面的用户这样做

MyClassPHP::$myVar++;
echo MyClassPHP::$myVar;

它始终是 1。无论我刷新多少次或同时连接多少次...... WOHHH 这是一个很好的结论,否则我搞砸了!


ASP.NET 更新

经过进一步的研究和测试,我发现了这一点。

public partial class MyPage : System.Web.UI.Page
{
    public static int myInt = 0;

    protected void Page_PreInit(object sender, EventArgs e)
        myInt++;
    }

}

然后我的页面就可以显示了myInt

myInt当我刷新页面时,在浏览器(Firefox 和 chrome)之间逐渐变高。所以这并不重要,如果你classstatic。仅当您有静态变量时才重要。它们的应用范围很广。

4

2 回答 2

7

在 IIS 中运行时:

静态变量不是“页面”特定的。它是“AppDomain”特定的。与“页面”的唯一关系是变量的路径(可以这么说)(例如 MyProject.MyPage.MyVariable)。因为您的应用程序的所有用户都在同一个 AppDomain(即同一个 IIS 应用程序文件夹)中运行,所以他们都将使用同一个静态变量。所以...最终您的用户将看到彼此的信息,因为他们都共享一个静态变量。

然而,PHP 会跟踪每个用户实例的静态数据,所以我想你可以称它们为“远离单例危险区域更安全”。

于 2012-05-23T20:10:48.383 回答
0

不,PHP 不像 ASP.NET 那样愚蠢(它真的那么做吗?)。PHP 中的静态变量是每个实例的(它不像 ASP.NET 那样整个页面都是一个实例,每个用户都有自己的 PHP 实例)。

如果 2 个用户访问一个 PHP 页面,并且在一个页面MyClass::$myVar = true上运行,则不会影响另一个用户。

于 2012-05-23T20:06:22.430 回答