C# System.Web.Caching.Cache行为
我的web应用程序正在缓存对象列表,以避免反复从数据库获取它们。在一个页面上,从缓存中提取列表,然后将其他对象添加到列表中,并显示在数据绑定控件中。这些额外的对象并不意味着要被缓存,但在某种程度上仍然存在 使用Cache.Get()方法时,它应该返回对象引用还是该对象的副本?: 缓存对象没有关于其包含的项的内容的信息。它只保存对这些对象的引用 如果要修改列表而不更改其缓存的表示形式,只需使用原始列表作为源创建一个新列表:C# System.Web.Caching.Cache行为,c#,asp.net,C#,Asp.net,我的web应用程序正在缓存对象列表,以避免反复从数据库获取它们。在一个页面上,从缓存中提取列表,然后将其他对象添加到列表中,并显示在数据绑定控件中。这些额外的对象并不意味着要被缓存,但在某种程度上仍然存在 使用Cache.Get()方法时,它应该返回对象引用还是该对象的副本?: 缓存对象没有关于其包含的项的内容的信息。它只保存对这些对象的引用 如果要修改列表而不更改其缓存的表示形式,只需使用原始列表作为源创建一个新列表: var fromCache = Cache.Get("MyList") a
var fromCache = Cache.Get("MyList") as List<Foo>;
if (fromCache != null)
{
var listToModify = new List<Foo>(fromCache);
listToModifyAdd(new Foo { ... });
}
var fromCache=Cache.Get(“MyList”)作为列表;
if(fromCache!=null)
{
var listToModify=新列表(fromCache);
ListToModfyAdd(新Foo{…});
}
请注意,这只是防止修改缓存的列表,对列表中对象的修改仍然表示连续的Cache.Get()
调用
如果您想防止这种情况发生,请查看。:
缓存对象没有关于其包含的项的内容的信息。它只保存对这些对象的引用
如果要修改列表而不更改其缓存的表示形式,只需使用原始列表作为源创建一个新列表:
var fromCache = Cache.Get("MyList") as List<Foo>;
if (fromCache != null)
{
var listToModify = new List<Foo>(fromCache);
listToModifyAdd(new Foo { ... });
}
var fromCache=Cache.Get(“MyList”)作为列表;
if(fromCache!=null)
{
var listToModify=新列表(fromCache);
ListToModfyAdd(新Foo{…});
}
请注意,这只是防止修改缓存的列表,对列表中对象的修改仍然表示连续的Cache.Get()
调用
如果您想防止这种情况发生,请查看。
System.Web.Caching.Cache
是一种内存缓存。这意味着对象引用是从Cache.Get()调用返回的。在执行get后修改引用时,您正在修改仍在缓存中的同一对象
您需要手动执行克隆操作以不修改原始对象。System.Web.Caching.Cache
是内存缓存。这意味着对象引用是从Cache.Get()调用返回的。在执行get后修改引用时,您正在修改仍在缓存中的同一对象
您需要手动执行克隆操作才能不修改原始对象。@CodeCaster我将其改为“内存中”缓存,而不仅仅是“内存缓存”。我不会称Memcached为“内存中”,因为它是进程外的,但是对于大多数内存中缓存的实现,它们只存储引用,除非它们要求缓存中的所有对象都是可序列化的(这是一个很好的迹象,表明它们不只是存储引用)。谢谢您的回答!我也这么想,但不确定。我以前已经习惯于在类似这样的任务中使用Session变量。@CodeCaster我将其改为“内存中”缓存,而不仅仅是“内存缓存”。我不会称Memcached为“内存中”,因为它是进程外的,但是对于大多数内存中缓存的实现,它们只存储引用,除非它们要求缓存中的所有对象都是可序列化的(这是一个很好的迹象,表明它们不只是存储引用)。谢谢您的回答!我也这么想,但不确定。我以前已经习惯于在类似这样的任务中使用Session变量。