『卧槽』意外发现了 Hashtable 的 foreach 用法 BUG
这段时间,公司项目中 遇到一个问题,最后查出: 是 Hashtable 的用法导致的。
1 private static void AutoCleanCache() 2 { 3 try 4 { 5 lock (m_HashCache.SyncRoot) 6 { 7 List<object> listKey = new List<object>(); 8 List<Tuple<string, DateTime, byte[]>> list = new List<Tuple<string, DateTime, byte[]>>(); 9 if (m_HashCache.Count >= MAXCACHE) 10 { 11 //foreach (KeyValuePair<object, object> pair in m_HashCache) //不能这样使用 Hashtable —— 可能会导致: 指定的转换无效 的异常 12 foreach (object key in m_HashCache.Keys) 13 { 14 object value = m_HashCache[key]; 15 var svg = key as string; 16 var bytes = value as Tuple<DateTime, byte[]>; 17 if (string.IsNullOrWhiteSpace(svg) || (bytes == null || bytes.Item2 == null || bytes.Item2.Length <= 0)) listKey.Add(key); 18 19 list.Add(new Tuple<string, DateTime, byte[]>(svg, (bytes == null ? DateTime.MinValue : bytes.Item1), (bytes == null ? null : bytes.Item2))); 20 } 21 } 22 23 List<Tuple<string, DateTime, byte[]>> list2 = Enumerable.ToList(list.OrderBy(x => x.Item2).Take(list.Count / 2)); 24 foreach (var item in list2) listKey.Add(item.Item1); 25 foreach (var key in listKey) m_HashCache.Remove(key); 26 27 listKey.Clear(); 28 list.Clear(); 29 list2.Clear(); 30 } 31 } 32 catch (Exception ex) 33 { 34 logger.Warn(ex); 35 } 36 }
代码很丑 —— 各位不要介意。
我们只看重点代码:
1 //foreach (KeyValuePair<object, object> pair in m_HashCache) //不能这样使用 Hashtable —— 可能会导致: 指定的转换无效 的异常 2 foreach (object key in m_HashCache.Keys)
结论:
Hashtable 不要 foreach KeyValuePair<object, object>
这下好了, 我这边 一堆底层代码 都遭殃了 ~
分类:
练手片段调错
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库