2011-07-12 56 views
2

我最近遇到了麻煩。現在是一個靜態對象/變量存儲在.NET上的Web應用程序中的緩存/會話?

public static MyObject myobject=new MyObject(); 
Response.Write(myobject.Title()); 

,如果我加載不包含MyObject來的聲明的另一頁,我再做

Response.Write(myobject.Title()); 

在一個WebForm我宣佈一個靜態的對象,這樣的我看到了前面的結果。由於靜態導航過程中,對象是否存儲在會話中?這是由VIEWSTATE計算的嗎?或者發生了什麼?

+4

在頁面沒有靜態字段! –

+0

它存儲在您的應用程序中:服務器端,所有用戶。 –

+0

@Danny Chen:爲什麼? – markzzz

回答

2

它只是一個靜態變量。它與該類型一起「生活」 - 因此它將被同一AppDomain中的相同類型的所有代碼共享。將失去AppDomain回收,並不會在多個服務器共享等

基本上它是不是比偶爾本地緩存其他的web應用使用static變量是個好主意......

+0

嗯......但是在每一個「用戶」中都有一個相同對象的實例;我的意思是一個用戶請求一個頁面和實例MyObject將訪問它,只有它,而不是另一個用戶的另一個實例。那麼會有什麼問題呢? – markzzz

+1

靜態變量不屬於實例,它們屬於類型。所以用戶獲得一個頁面的實例,但服務器保存該類型。如果有的話,每個實例將獲得類型的靜態變量。當AppDomain回收時,靜態變量將被重置。 –

+0

因此,如果用戶A持有的靜態對象,並保存到它(例如)數據馬可波羅,另一個用戶(比如用戶B)可以讀馬可? – markzzz

4

不,它存儲爲過程中的靜態變量,可以在任何時候回收,假設您使用IIS。

總之,儘量不要在這種情況下使用靜態變量。

擴大正在發生的事情。靜態變量存儲在由IIS控制的服務器進程中。當你回撥到服務器時,這個過程仍然還活着。 IIS可以隨時回收這個過程。

更新:確定更準確的是每個AppDomain,它坐落在一個過程 - 與替代的AppDomain字的過程中我前面的段落:-)在用戶之間共享

2

靜態對象。它不存儲在對每個頁面唯一的用戶或視圖狀態唯一的會話中。

請閱讀ASP .NET State Management Recommendations以瞭解哪種類型的狀態管理功能用於哪種情況。

1

如果它有幫助,我傾向於認爲你可以在一個類中聲明兩個單獨的對象 - 動態對象定義和靜態對象。通常,如果你在同一個類定義中創建它們,它們之間就有一個連接,並且它們協同工作(單例模式就是一個很好的例子)。

這意味着對象是基於動態對象創建的。仍然有一個靜態對象不受創建動態對象的影響。因爲這可能會造成混淆,所以不應該小心並理解兩者之間的區別。

我意識到這不是對發生的事情的真正理解,但它有助於我保持區分。每種類型都有它自己的用途,並且應該適當地使用(我已經看到動態類應該是靜態的,以及其他方式)。

相關問題