2012-06-20 71 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