【问题标题】:Static Variables somehow maintaining state?静态变量以某种方式保持状态?
【发布时间】:2010-04-07 00:59:19
【问题描述】:

我正在处理一个现有项目,由另一位编码员设置。我在理解页面之间如何维护状态时遇到了一些麻烦。有一个类库,其中有一些帮助对象。这些对象大多只用于静态方法,很少实例化或继承。

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

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 中使用这个类库或什么?
  • 这是正确的,它是一个 ASP.Net 应用程序

标签: c# asp.net


【解决方案1】:

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

这是你真正需要知道的:

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

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

所以如果这个值是一个计数器例如:

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”。这可能是从几个浏览器同时执行您的测试页面的结果。

  • 静态变量总是在您第一次访问或创建类的实例时初始化。他们都初始化。因此,如果您有一个很大的“桶”或静态变量(我称设计不良的帮助类“桶”),并且您只使用其中一个,那么当时仍然为每个变量分配内存。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      大多数 Web 应用程序/框架实际上会在调用之间保持代码运行,并且仅在服务器或工作线程关闭时才停止它。 PHP 是一个奇怪的地方,不是其他人。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 基本上只是全局变量类,它们都将作为静态变量存在于不同的类中,因为我们有几种类型的全局变量。有些是从数据库中获取的,有些是常量,有些是在客户端计算出来的。
        • 谨慎使用它们,静态提供了可预测的行为,但如果没有经过深思熟虑,可能会非常出乎意料。基于客户端计算——这听起来更适合会话变量。数据库——你真的需要减少连接吗?您可能会使用缓存获得更好的优化。常量——好的,我给你常量。
        猜你喜欢
        • 1970-01-01
        • 2021-10-19
        • 2022-08-13
        • 2011-05-24
        • 2018-09-23
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多