Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Web.Caching.Cache行为_C#_Asp.net - Fatal编程技术网

C# System.Web.Caching.Cache行为

C# System.Web.Caching.Cache行为,c#,asp.net,C#,Asp.net,我的web应用程序正在缓存对象列表,以避免反复从数据库获取它们。在一个页面上,从缓存中提取列表,然后将其他对象添加到列表中,并显示在数据绑定控件中。这些额外的对象并不意味着要被缓存,但在某种程度上仍然存在 使用Cache.Get()方法时,它应该返回对象引用还是该对象的副本?: 缓存对象没有关于其包含的项的内容的信息。它只保存对这些对象的引用 如果要修改列表而不更改其缓存的表示形式,只需使用原始列表作为源创建一个新列表: var fromCache = Cache.Get("MyList") a

我的web应用程序正在缓存对象列表,以避免反复从数据库获取它们。在一个页面上,从缓存中提取列表,然后将其他对象添加到列表中,并显示在数据绑定控件中。这些额外的对象并不意味着要被缓存,但在某种程度上仍然存在

使用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()
调用

如果您想防止这种情况发生,请查看。

缓存对象没有关于其包含的项的内容的信息。它只保存对这些对象的引用

如果要修改列表而不更改其缓存的表示形式,只需使用原始列表作为源创建一个新列表:

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变量。