c# - 静态变量以某种方式维护状态?

标签 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);

我需要创建更多这样的类,但首先想了解为什么会发生这种情况。

非常感谢

最佳答案

正如其他人正确指出的那样:在 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。)

关于c# - 静态变量以某种方式维护状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2589362/

相关文章:

c# - 使用 C# 比较两个 ArrayList 内容

c# - 如何将值插入到 gridview 行中? ASP.NET,C#

asp.net - 使用 JQuery 渲染部分 View 时遇到问题

c# - 处理关闭/断开网络套接字连接(CloseAsync 与 CloseOutputAsync)

c# - 在 div 上使用 .FindControl() 失败

javascript - 如何在 JQuery AJAX 文件上传中添加唯一标识符?

c# - C#如何基于LINQ查询中的字符串数组声明新的Dictionary对象

c# - 当 Enumerable 在 Linq 中有超过 X 个元素时提前返回

c# - WiX 烧录 : how to change 'WixBundleManufacturer' in bootstrapper application?

c# - ASP.NET Core 的最小 docker