2010-04-07 132 views
2

我正在处理一个现有的项目,由另一个编码器设置。我在理解页面之间的状态维护方面遇到了一些麻烦。有一个类库有一些帮助对象。大多数情况下,这些对象仅用于静态方法,很少实例化或继承。静态变量以某种方式维护状态?

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

public sealed class Application 
{ 
    public static string Test; 
} 

现在,当我运行像在基类中我的网页下面,我希望得到的结果是“1:2:测试”所有的时间(注意,“1”为空),但只有在第一次运行时才会这样。然后每次都是“1:测试2:测试”。不知何故,它维护页面之间的静态变量的状态和正在刷新?

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

SharedLibrary.Application.Test = "Test"; 

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

我需要创建更多这样的类,但要理解为什么这是发生在第一位。

非常感谢

+0

“页面和被刷新”是否意味着你在ASP.Net中使用这个类库或什么? – Earlz 2010-04-07 01:03:06

+2

这是正确的,它是一个ASP.Net App – gfoley 2010-04-07 01:07:03

回答

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

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

  • 最后,这个值是从来没有垃圾收集。所以如果你在静态变量中放置一个大的项目,那么只要进程存在,它就会消耗这个内存。 (请不要把一次性资源,即SqlConnection的,在那里。)

+0

+1为“设计糟糕”的参考。 – VoidDweller 2010-04-07 02:28:11

2

在ASP.Net,作为服务器正在运行(只有少数例外)静态变量保持自己的状态,只要。如果您希望有一个静态变量在页面刷新时不保持其状态(请参阅:HTTP请求),请围绕HttpContext类包装一个属性。

0

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

0

静态类静态成员一旦加载(访问)保留在内存中直到加载它的应用,是卸载。所以,当你的页面请求访问静态成员SharedLibrary.Application.Test每个请求正在访问相同的内存位置。

MSDN文章Static Classes and Static Class Members会给你一些额外的见解。

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

+0

基本上只是全局变量类,它们都将作为静态变量存在于不同的类中,因为我们有几种类型的全局变量。有些是从数据库中提取的,有些是常量,有些是基于客户端计算的。 – gfoley 2010-04-07 03:41:08

+0

谨慎使用它们,静态提供可预测的行为,但如果没有经过深思熟虑可能会出乎意料。基于客户端计算 - 这听起来适合会话变量。数据库 - 你真的需要减少到连接吗?使用缓存可能会得到更好的优化。常量 - 好吧,我会给你常量。 – VoidDweller 2010-04-10 17:19:49