缓存被修改而不是局部变量(通过ref传递)

时间:2011-05-24 22:18:10

标签: c# asp.net caching byref byval

我正在写一个.net c#应用程序。

我从xml文件中检索一些数据,将数据缓存到.net缓存并从我的方法返回。我对数据执行一些处理并将其返回给我的应用程序的另一部分。

下一次调用,我从缓存中读取,处理它并返回它等。

我遇到的问题是对缓存数据执行的处理似乎修改了缓存而不是本地变量,这意味着下次我从缓存中读取时,它处理的数据来自之前返回的处理。

所以看起来缓存返回的数据是由ref返回的,而不是值。

知道如何防止缓存被修改?

3 个答案:

答案 0 :(得分:5)

内存缓存将存储指向该对象的指针。它就像一个全局变量。缓存项的任何其他变量赋值都将引用同一对象。对于进程外或分布式缓存,这是不同的。对于这些类型的缓存,必须从缓存中序列化和反序列化该对象。在这些情况下,您将获得副本。

如果要模拟进程外的行为,可以复制/克隆对象或序列化/反序列化缓存中的对象。

答案 1 :(得分:3)

这是一个相当基本的事情,您需要了解数据类型。

听起来你的缓存存储引用类型,即对象的实例或类似的东西。当你传递其中一个时,你会得到一个对实例的引用,引用本身实际上是按值传递的,也就是说你不能改变引用,但当然它可以改变引用的那个,这就是你所看到的行为。

如果您希望这样做,以便在使用它们时实例保持不变,那么首先复制它们。 (如果它们是复杂类型,您可能需要编写克隆方法)

答案 2 :(得分:1)

根据类型的不同,解决方案可能只是在从缓存中克隆检索对象/项目。

XmlNode Clone method