2010-09-24 19 views
0

在很多地方我看到了以下模式。考慮代碼:需要說明Session是如何工作的?

Customer cust = (Customer) Session["Customer"]; 

//Do something to the object cust 

Session["Customer"] = cust 

和代碼:

Customer cust = (Customer) Cache["Customer"]; 

//do something to object cust 
Cache["Customer"] = cust; 

現在,在第二種情況下,把卡斯特對象返回給高速緩存作爲參考是相同的,並且對任何改變不要求cust對象應該反映在緩存中。

但我不認爲在Session的情況下,cust對象必須顯式地放回到Session中。但是,我不確定。如果我沒有像上面那樣明確指定更改,那麼更改是否會反映在Session中?

如果需要明確地做,爲什麼與Cache對象的行爲差異?這兩個地方我們似乎都在做參照傳球。

這是C#,ASP.NET

+0

您可能希望指定您要查詢的語言和框架。 – kwatford 2010-09-24 15:39:32

+0

謝謝指出! – shashi 2010-09-24 15:46:27

回答

0

您不必明確重新分配對象返回給會話。對從Session中檢索到的對象所做的任何更改都會反映並保留在Session中。緩存不同,因爲它可能會過期。如果您需要任何進一步的幫助,請告訴我。

另一件事,InProc會話比Cache更快,因爲Cache必須在返回對象之前檢查過期。

存儲在Session和Cache中的對象只是一個指向對象的指針,因此對該對象所做的任何更改都將被持久化,而不需要將該對象明確地重新分配給它來自的Session或Cache。

+0

除非它是不可變的類型,例如字符串。 – Nikki9696 2010-09-24 16:17:33

2

字符串是不可變的。爲什麼要擔心數據類型以及是否需要重新分配數據類型?只需重新安排它是安全的,清楚你的意圖。

要明白我的意思,請運行此操作並檢查值。你會發現它在會話中沒有改變。 x的值將是「bar」。

 Session["foo"] = "bar"; 

     var s = Session["foo"]; 
     s = "baz"; 

     var x = Session["foo"]; 

     Debugger.Break();