正在修改缓存而不是本地变量(通过ref传递)
本文关键字:变量 通过 ref 传递 修改 缓存 | 更新日期: 2023-09-27 17:57:30
我正在编写一个.net c#应用程序。
我从xml文件中检索一些数据,将数据缓存到.net缓存中,然后从我的方法中返回。我对数据进行一些处理,并将其作为应用程序的另一部分返回。
下一次调用,我从缓存中读取,处理它并返回它等。
我遇到的问题是,对缓存数据执行的处理似乎修改了缓存,而不是本地变量,这意味着下次我从缓存中读取时,返回的是上一次处理中的已处理数据。
因此,从缓存返回的数据似乎是由ref而不是value返回的。
知道如何防止缓存被修改吗?
内存缓存将存储指向对象的指针。它就像一个全局变量。分配给缓存项的任何其他变量都将引用同一对象。这对于进程外缓存或分布式缓存是不同的。对于这些类型的缓存,必须从缓存中序列化和反序列化对象。在这种情况下,你会得到副本。
如果你想模拟进程外的行为,你可以复制/克隆一个对象,或者序列化/反序列化缓存外的对象。
这是您需要了解的关于数据类型的基本内容。
听起来您的缓存正在存储引用类型,即对象实例或类似的东西。当你被传递其中一个时,你会得到一个对实例的引用,引用本身实际上是通过值传递回来的,也就是说,你不能改变引用,但它所引用的thihg当然可以改变,这就是你看到的行为。
如果您希望这样做,以便在使用实例时实例保持不变,那么请先制作它们的副本。(如果它们是复杂类型,则可能需要编写一个克隆方法)
根据类型的不同,解决方案可能只是在从缓存检索时克隆对象/项。
XmlNode克隆方法