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

gfo*_*ley 2 c# asp.net

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

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

public sealed class Application
{
    public static string Test;
}
Run Code Online (Sandbox Code Playgroud)

现在当我在页面的基类中运行类似下面的内容时,我希望结果一直是"1:2:Test"(注意"1"是空的),但是它只是这样的第一次运行.然后每次都是"1:测试2:测试".不知怎的,它维护页面之间的静态变量的状态并被刷新?

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

SharedLibrary.Application.Test = "Test";

Response.Write(" 2:" + SharedLibrary.Application.Test);
Run Code Online (Sandbox Code Playgroud)

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

非常感谢

Jen*_*uak 5

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

这是你真正需要知道的:

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

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

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

Response.Write("1:" + SharedLibrary.Application.Test);
SharedLibrary.Application.Test = int.Parse(SharedLibrary.Application.Test) + 1;
Response.Write(" 2:" + SharedLibrary.Application.Test);
Run Code Online (Sandbox Code Playgroud)

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

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

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