System.Web.Caching.Cache Behavior

时间:2017-07-27 22:03:47

标签: c# asp.net

我的Web应用程序正在缓存对象列表,以避免不得不一遍又一遍地从数据库中获取它们。在一个页面上,从缓存中获取List,然后将其他对象添加到列表中并显示在数据绑定控件中。这些额外的对象不是要缓存的,但仍然是某种方式。

当你使用Cache.Get()方法时,是否应该返回一个对象引用或该对象的副本?

2 个答案:

答案 0 :(得分:3)

MSDN: Caching Application Data

  

Cache对象没有关于它包含的项目内容的信息。它只是持有对这些对象的引用

如果要在不改变其缓存表示的情况下修改列表,只需使用原始列表作为源创建新列表:

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  syntax error at or near "as"
LINE 1: ...EXTRACT(MINUTE FROM (check_out_at - check_in_at)) as minutes...

请注意,这只会阻止缓存的列表被修改,对列表中的对象的修改仍将代表连续的var fromCache = Cache.Get("MyList") as List<Foo>; if (fromCache != null) { var listToModify = new List<Foo>(fromCache); listToModifyAdd(new Foo { ... }); } 次调用。

如果您想要阻止这种情况,请查看Deep cloning objects

答案 1 :(得分:2)

System.Web.Caching.Cache是内存缓存。这意味着对象引用是从Cache.Get()调用返回的内容。在执行get操作后修改引用时,您将修改仍在缓存中的同一对象。

您需要手动执行克隆操作以不修改原始对象。