Csharp/C#教程:以只读方式读取HttpRuntime.Cache项分享


以只读方式读取HttpRuntime.Cache项

我正在使用HttpRuntime.Cache来存储将在会话中频繁访问的对象列表。

我使用以下代码行从缓存中获取项目:

 List _chartData = (List)HttpRuntime.Cache.Get("rollingMonth"); 

但是,不幸的是,当我更新_chartData时 ,它也会更新缓存的项目。

我怎样才能简单地获得缓存项目的副本?

这就是.NET的工作方式,因为Cache只引用了List指针 。 不知道chartData_Type是值类型还是引用类型。

如果是值类型,则易于使用:

 List list = new List(_chartData); 

但是如果引用类型变得复杂,则需要为您的类实现DeepCopy方法,然后对列表中的每个对象执行DeepCopy

DeepClone方法:

 public static class CloneHelper { public static T DeepClone(T obj) { using (var ms = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); ms.Position = 0; return (T) formatter.Deserialize(ms); } } } 

要使用此方法,必须将类chartData_Type标记为[Serializable]

 [Serializable] class chartData_Type {} 

因此,您可以手动进行深度克隆:

 var cloneChartData = _chartData.Select(d => CloneHelper.DeepClone(d)) .ToList(); 

使用:

 List list = new List(_chartData); 

它会将_chartData所有项目复制到list

List是引用类型,_chartData保存缓存中存储的原始对象的地址。 这就是为什么当你更新_chartData时,它也会更新缓存的对象。 如果需要单独的对象,则克隆缓存的对象。 见下面的参考

https://www.codeproject.com/Articles/33364/ASP-NET-Runtime-Cache-Clone-Objects-to-Preserve-Ca

https://www.codeproject.com/Articles/45168/ASP-NET-Runtime-Cache-Clone-Objects-to-Preserve-Ca

上述就是C#学习教程:以只读方式读取HttpRuntime.Cache项分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1001137.html

(0)
上一篇 2021年12月28日
下一篇 2021年12月28日

精彩推荐