我有一个WCF服务,使用HttpRuntime.Cache存储60分钟的客户列表
如果你运行以下内容,为什么字符串第三次包含'string3'
string mykey = "mykey-1";
List<string> strings = null;
strings = HttpRuntime.Cache[mykey] as List<string>;
if (strings == null)
{
strings = new List<string>();
strings.Add("string1");
strings.Add("string2");
HttpRuntime.Cache[mykey] = strings;
}
else
{
strings.Add("string3");
}
我希望:
第一轮:字符串对象为null,因此创建了'string1'和'string2'并且它已缓存
第二轮:字符串从缓存中拉出,并添加了'string3'
第三轮:字符串从缓存中拉出,但在你再次添加'string3'之前它已经得到了它。
是共享内存还是应用程序池中的内容。如果你将它从缓存中取出然后更改它,它就会更改缓存版本而不必重新添加它。
如果我再次运行代码,我将获得另一个'string3'等
提前致谢
答案 0 :(得分:0)
List<string>
类是引用类型。这意味着您可以拥有多个引用同一实例的变量。如果使用其中一个变量更改某些内容,则更改也将通过其他变量可见,因为它们实际上都引用了相同的对象/实例。
在您的示例中,在第一个请求中创建List<string>
的新实例,向其中添加一些字符串,然后将其添加到缓存中。因此,在第一次请求之后,HttpRuntime.Cache
对象将保存对已创建的List<string>
实例的引用。
在第二个请求中,您可以将List<string
的此实例的引用分配给strings
变量。因此strings
引用在第一个请求中创建的实例。并且HttpRuntime.Cache
仍然持有对同一实例的引用。然后,再向列表中添加一个字符串。 List<string>
的一个实例在内存中更新以包含新字符串。
在第三次运行中,您再次将对同一实例的引用复制到strings
变量。这仍然引用在第一个请求中创建的完全相同的实例,稍后在第二个请求中进行修改。因此,在第三个请求中,它已包含string3
值。由于List<string>
可以愉快地包含具有相同值的多个项目,因此第三个请求会将另一个项目添加到值为string3
的列表中。等等之后的进一步请求。
你写了
是共享内存还是应用程序池中的内容。哪个,如果你 将它拉出缓存然后更改它,它会更改缓存版本 无需重新添加。
当你执行strings = HttpRuntime.Cache[mykey] as List<string>;
时,你并没有真正将它从缓存中拉出来。而是要创建对已在缓存中引用的内容的引用。
所以答案是肯定的,通过本地引用(= strings
变量)完成的更改将“存储”在缓存中而无需重新添加。