2012-06-20 42 views
6

我只是想知道这一天。我不完全确定ASPX如何管理垃圾处理,但据我所知,“完成的加载”不会删除静态内存值或页面重新加载后。至少就C而言,静态意味着在程序本身关闭之前,内存分配跟随你的程序。这在ASPX中是一样的吗?如果我有一个静态值,并且从页面A转到页面B,那么静态值在内存中仍然保留,直到他们离开应用程序,或者当我不再处于页面A时,该值会被删除? (转到另一个网站,将其实例从服务器中的应用程序池中除去)。ASP.NET中的静态对象会浪费内存吗?

从我所经历的:

public static class foo 
    { 
     public static int x; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     foo.x++; //This will continue to increment from the last value before reload 
    } 
+0

http://stackoverflow.com/questions/1714064 –

+0

http://stackoverflow.com/questions/1563171 –

+0

http://stackoverflow.com/questions/3814608 –

回答

5

静态类应避免在ASP.NET。它们留在内存中,直到应用程序重新启动并受到许多并发错误和竞争条件的影响。

并关闭用户会话(浏览器会话)不会重新启动应用程序!即使用户离开并返回,他们仍留在记忆中。所以真的真的避免静态类!

+0

你有一篇文章或某种引用更多地涉及这个问题?我会很有兴趣了解更多。 –

+0

看看你可以在你的问题的评论中找到的链接。你也可以看看这里http://bytes.com/topic/c-sharp/answers/878381-static-variable-hell-asp-net和这里http://www.foliotek.com/devblog/avoid-static- asp-net/StackOverFlow中的变量也有很多帖子。 –

+2

请注意,如果您确实需要在整个应用程序中共享信息,您可能需要使用静态变量。但在这种情况下,我宁愿使用单例。 –

0

这是标准的CLR执行模型,它是asp.net没有什么不同。静态对象被认为是应用程序的根,并且不被垃圾收集。

这是垃圾收集在.NET中是如何工作的一个老的文章,但我认为,所有的原则仍然是相同的:http://msdn.microsoft.com/en-us/magazine/bb985010.aspx