2017-07-27 27 views
1

我的Web應用程序緩存對象列表以避免必須一次又一次從數據庫中獲取它們。在一頁上,從緩存中取出列表,然後將其他對象添加到列表中並顯示在數據綁定控件中。這些額外的對象並不意味着被緩存,但仍然以某種方式。System.Web.Caching.Cache行爲

當您使用Cache.Get()方法時,是否應該返回對象引用或該對象的副本?

回答

2

System.Web.Caching.Cache是一個內存中緩存。這意味着對象引用是從Cache.Get()調用返回的內容。在執行get操作後修改引用時,您正在修改仍在緩存中的同一對象。

您需要手動執行克隆操作才能不修改原始對象。

+1

@CodeCaster我重新措辭它說「內存」緩存,而不是「內存緩存」。我不會將memcached稱爲「in-memory」,但是對於大多數內存緩存的實現來說,它們只是存儲引用,除非它們需要緩存中的所有對象都可以序列化(這是一個很好的信號他們不只是存儲引用)。 –

+0

謝謝你的回答!我儘可能多地想,但不確定。我已經習慣使用Session變量來處理以前的任務。 – Zachary

3

MSDN: Caching Application Data

緩存對象沒有包含的關於項目的內容信息。它僅僅是持有對這些對象的參考。

var fromCache = Cache.Get("MyList") as List<Foo>; 
if (fromCache != null) 
{ 
    var listToModify = new List<Foo>(fromCache); 
    listToModifyAdd(new Foo { ... }); 
} 

請注意,這只是防止緩存列表來自:

如果要修改的列表而不改變其緩存表示,簡單地使用原來的列表作爲源創建一個新的列表被修改,中的對象的修改該列表仍將表示來自連續的Cache.Get()調用。

如果您想要防止這種情況發生,請參閱Deep cloning objects