静态变量以某种方式维持状态?

时间:2010-04-07 00:59:19

标签: c# asp.net

我正在开发一个现有项目,由另一个程序员设置。我在理解页面之间如何维护状态方面遇到了一些麻烦。有一个类库,它有一些辅助对象。大多数情况下,这些对象仅用于静态方法,很少实例化或继承。

这是我正在测试的一个示例类。

public sealed class Application
{
    public static string Test;
}

现在,当我在页面的基类中运行类似下面的内容时,我希望结果始终为“1:2:Test”(请注意“1”为空),但仅仅是扼杀它这是第一次运行。然后每次都是“1:测试2:测试”。不知何故,它维护页面之间的静态变量的状态并被刷新?

Response.Write("1:" + SharedLibrary.Application.Test);

SharedLibrary.Application.Test = "Test";

Response.Write(" 2:" + SharedLibrary.Application.Test);

我需要创建更多这样的类,但是想要了解为什么会出现这种情况。

非常感谢

4 个答案:

答案 0 :(得分:5)

正如其他人所说:在Asp.Net应用程序中声明为静态变量的任何内容都将保持其相同的值,直到更改为止。

以下是您真正需要了解的内容:

  • 当应用程序池回收时(,如果,但 时),此值将丢失。通常每天都会发生这种情况,但如果内存不足或发生崩溃,也会发生这种情况。

  • 所有请求将同时访问此值,即多个用户等。

因此,如果此值是计数器,例如:

Response.Write("1:" + SharedLibrary.Application.Test);
SharedLibrary.Application.Test = int.Parse(SharedLibrary.Application.Test) + 1;
Response.Write(" 2:" + SharedLibrary.Application.Test);

您可能会发现意外的输出,例如“1:53 2:55”。这是从几个浏览器同时执行测试页面的结果。

  • 当您第一次访问或创建类的实例时,静态变量始终会初始化。他们都初始化了。因此,如果你有一个很大的“桶”o'静态变量(我称之为设计糟糕的助手类“桶”),并且你只使用其中一个,那么当时仍然会分配每个内存。

  • 最后,此值从不垃圾收集。因此,如果在静态变量中放置一个大项,那么只要进程存在,它就会消耗该内存。 (请不要在其中放置一次性资源,即SqlConnection。)

答案 1 :(得分:2)

在ASP.Net中,只要服务器正在运行,静态变量就会保持其状态(除了少数例外)。如果你想让一个静态变量在页面刷新时不保持它的状态(读取:HTTP请求),那么在HttpContext类周围包装一个属性。

答案 2 :(得分:0)

大多数Web应用程序/框架实际上使代码在调用之间运行,并且只在服务器或工作程序关闭时才停止它。 PHP在这里是奇怪的,而不是其他所有人。

答案 3 :(得分:0)

静态类静态成员一旦加载(访问)保留在内存中,直到加载它的应用程序卸载。因此,当您的页面请求访问静态成员 SharedLibrary.Application.Test 时,每个请求都访问相同的内存位置。

MSDN文章Static Classes and Static Class Members将为您提供一些额外的见解。

当你说你需要创建更多这样的类时,你希望这些类做什么?