我的Web应用程序正在缓存对象列表,以避免不得不一遍又一遍地从数据库中获取它们。在一个页面上,从缓存中获取List,然后将其他对象添加到列表中并显示在数据绑定控件中。这些额外的对象不是要缓存的,但仍然是某种方式。
当你使用Cache.Get()方法时,是否应该返回一个对象引用或该对象的副本?
答案 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操作后修改引用时,您将修改仍在缓存中的同一对象。
您需要手动执行克隆操作以不修改原始对象。