首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#更新缓存对象而不更新缓存

c#更新缓存对象而不更新缓存
EN

Stack Overflow用户
提问于 2014-01-02 10:40:30
回答 1查看 788关注 0票数 0

我有一个从缓存中检索的模型,我在几个页面上都使用了这个模型。模型的一部分有一个名为Breadcrumb的属性--它是面包屑元素的集合,并按如下方式更新:

代码语言:javascript
复制
model.Breadcrumbs.Add(UrlUtilities.Urls.DesignerJoinConfirmation, "Feedback Confirmation", "Thank you for your feedback");

我的问题是,即使我要从缓存中取回模型,当我从缓存返回后添加另一个面包屑时(例如对于子页面,我会将最新的页面添加到末尾),然后它将更新缓存的模型。是否有更新模型而不更新缓存的方法?

我尝试创建一个临时模型,并将缓存的对象重新分配给它,如下所示:

代码语言:javascript
复制
Model model = GetCachedModel();
Model tempModel = new Model();
tempModel = model;

然后更新tempModel,但这也会更新缓存的对象。我发现阻止缓存对象更新的唯一方法是创建tempModel,然后将每个属性与缓存模型分开重新分配,但如果每次都必须重新分配所有属性,这肯定会否定缓存的必要性。是否有更简单的方法来更新缓存对象而不更新缓存本身?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-02 10:54:04

我认为您将对对象的引用与对象混合在一起。当您从缓存中检索模型时,您实际上只获得了对缓存所引用的同一个对象的另一个引用。因此,通过引用所做的任何更改也将通过任何其他引用可见。

有两种方法可以避免这种情况:

  1. 从缓存复制模型实例。这将需要执行方面的一般援助。记住,这需要是一个深拷贝,模型本身的任何属性和字段都需要复制所引用的对象。递归地。
  2. 别把面包屑放进模型里。如果对同一模型的不同使用需要该属性的不同值,那么它不属于模型。

(也有使用值类型的选项-它们是复制的而不是引用的-但是良好的实践是:(1) vale类型应该很小(不是很多字段),(2)不可变。

模型模型= GetCachedModel();模型tempModel =新模型();tempModel =模型;

那是行不通的。您正在创建对新实例(tempModel)的引用,然后用缓存中对原始实例的引用覆盖该引用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20881082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档