面试官:实现一个带值变更通知能力的Dictionary
2021-08-16 10:15
921 查看
如题, 你知道字典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 索引器的用法。
相关文章推荐
- 从.NET迁移到.NET Core的一个主要原因,在于后者具备在Linux上运行的能力。但是对于大型企业应用,不可能实现一步迁移到位。由此,Microsoft推荐采用一种逐步迁移做法: 第一步,迁移到
- 存储过程实现数据库重构、变更的一个案例
- 用两个栈实现一个队列——我作为面试官的小结
- 用两个栈实现一个队列——我作为面试官的小结
- 用wepy写的一个关于小程序通知栏(公告栏)上下滚动效果实现
- C++用两个栈实现一个队列(面试官的小结)
- 用两个栈实现一个队列——我作为面试官的小结
- 基于vue框架手写一个notify插件实现通知功能的方法
- 一个具有认知能力的智能课件系统的JAVA实现
- 用两个栈实现一个队列——我作为面试官的小结
- 精通React/Vue系列之手把手带你实现一个功能强大的通知提醒框(Notification)
- 阿里面试官让我实现一个线程安全并且可以设置过期时间的LRU缓存,我蒙了!
- 对改善Dictionary时间性能的思考及一个线程安全的Dictionary实现
- 面试官:让你实现一个秒杀系统,你会怎么设计?
- 一个价值10亿美元的创意,但我没有能力实现它
- 手把手教您撸一个底部中心凸起的可以添加通知条数的底栏(安卓APP底栏点击第一次选中当前Fragment第二次点击更新当前页面(实现))
- 用两个栈实现一个队列——我作为面试官的小结
- 转:用两个栈实现一个队列——我作为面试官的小结
- 对改善Dictionary时间性能的思考及一个线程安全的Dictionary实现
- wp7中实现 INotifyPropertyChanged 是为了属性变更后的通知的代码笔记