我的web应用程序正在缓存对象列表,以避免一次又一次地从数据库中获取对象。在一个页面上,从缓存中获取列表,然后添加到列表中并显示在数据绑定控件中的其他对象。这些附加的对象不是用来缓存的,但仍然是缓存的对象。
当您使用Cache.Get()方法时,它应该返回对象引用还是该对象的副本?
发布于 2017-07-27 22:20:17
System.Web.Caching.Cache是内存中的缓存.这意味着对象引用是从Cache.Get()调用返回的。在完成get之后修改引用时,您正在修改仍然在缓存中的相同对象。
您需要手动执行克隆操作才能不修改原始对象。
发布于 2017-07-27 22:19:57
Cache对象没有有关其包含的项的内容的信息。它仅仅是保存了对那些对象的引用()。
如果要修改列表而不更改其缓存的表示形式,只需使用原始列表作为源创建一个新列表:
var fromCache = Cache.Get("MyList") as List<Foo>;
if (fromCache != null)
{
var listToModify = new List<Foo>(fromCache);
listToModifyAdd(new Foo { ... });
}请注意,这只会阻止缓存的列表被修改,对列表中对象的修改仍然会通过连续的Cache.Get()调用来表示。
如果您也想防止这种情况发生,请查看深度克隆对象。
https://stackoverflow.com/questions/45361758
复制相似问题