面试官:实现一个带值变更通知能力的Dictionary
如题, 你知道字典KEY对应的Value什么时候被覆盖了吗?今天我们聊这个刚性需求。
前文提要:
数据获取组件维护了业务方所有(在用)的连接对象,DBA能在后台无侵入的切换备份库。
上文中:DBA在为某个配置字符串切换新的连接信息时,SDK利用ClearPool(DBConnection conn)
清空与这个连接相关的连接池。
清空的时机: 维护在用连接的字典键值发生变更。
今天本文就来实现一个带值变更通知能力的字典。
编程实践
关键字: 变更 通知 字典
using System; using System.Collections.Generic; using System.Text; namespace DAL { public class ValueChangedEventArgs<TK> : EventArgs { public TK Key { get; set; } public ValueChangedEventArgs(TK key) { Key = key; } } public class DictionaryWapper<TKey, TValue> { public object objLock = new object(); private Dictionary<TKey, TValue> _dict; public event EventHandler<ValueChangedEventArgs<TKey>> OnValueChanged; public DictionaryWapper(Dictionary<TKey, TValue> dict) { _dict = dict; } public TValue this[TKey Key] { get { return _dict[Key]; } set { lock(objLock) { try { if (_dict.ContainsKey(Key) && _dict[Key] != null && !_dict[Key].Equals(value)) { OnValueChanged(this, new ValueChangedEventArgs<TKey>(Key)); } } catch (Exception ex) { Console.WriteLine($"检测值变更或者触发值变更事件,发生未知异常{ex}"); } finally { _dict[Key] = value; } } } } } }
旁白:
- 定义值变更事件
OnValueChanged
和变更时传递的事件参数ValueChangedEventArgs<TKey>
- 如何定义值变更,也就是如何判定值类型、引用类型的相等性 #
equal
、hashcode
# DictionaryWapper
的表征实现也得益于C#索引器
特性
订阅值变更事件
var _dictionaryWapper = new DictionaryWapper<string, string>(new Dictionary<string, string> { }); _dictionaryWapper.OnValueChanged += new EventHandler<ValueChangedEventArgs<string>>(OnConfigUsedChanged); //---- public static void OnConfigUsedChanged(object sender, ValueChangedEventArgs<string> e) { Console.WriteLine($"字典{e.Key}的值发生变更,请注意..."); }
最后像正常Dictionary一样使用DictionaryWapper:
// --- _dictionaryWapper[$"{dbConfig}:{connectionConfig.Provider}"] = connection.ConnectionString;
OK,本文实现了一个 带值变更通知能力的字典,算是一个刚性需求。
温习了 C# event 索引器的用法。
本文来自博客园,作者:{有态度的马甲},转载请注明原文链接:https://www.cnblogs.com/JulianHuang/p/15146425.html
欢迎关注我的原创技术、职场公众号, 加好友谈天说地,一起进化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2019-08-16 基于docker-compose的Gitlab CI/CD实践&排坑指南