面试官:实现一个带值变更通知能力的Dictionary

简介: 上文中 数据获取组件维护了业务方所有(在用)的连接对象,DBA能在后台无侵入的切换备份库今天本文就来实现一个带值变更通知能力的字典。

五毛钱的编程实践


关键字:变更 通知 字典


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;
                    }
                }
            }
        }
    }
}


旁白:


1.定义值变更事件OnValueChanged 和变更时传递的事件参数ValueChangedEventArgs<TKey>


2.如何定义值变更,也就是如何判定值类型、引用类型的相等性#equalhashcode#


3.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($"字典KEY:{e.Key}的值发生了变更,请注意...");          
}


最后像正常Dictionary一样为DictionaryWapper添加键值对:


_dictionaryWapper[$"{dbConfig}:{connectionConfig.Provider}"] = connection.ConnectionString;



五毛钱的结尾语


OK,本文实现了一个带值变更通知能力的字典,算是一个刚性需求。


通过本文,重温了C# event索引器的用法,基础不牢,地动山摇。

相关文章
|
7月前
|
测试技术
线上问题,如何处理?
线上问题,如何处理?
180 37
|
2月前
|
消息中间件 存储 分布式计算
大数据-72 Kafka 高级特性 稳定性-事务 (概念多枯燥) 定义、概览、组、协调器、流程、中止、失败
大数据-72 Kafka 高级特性 稳定性-事务 (概念多枯燥) 定义、概览、组、协调器、流程、中止、失败
43 4
|
4月前
|
存储 边缘计算 缓存
钉钉发展与优化迭代问题之钉钉每次消息发送都要查询路由服务带来的压力如何解决
钉钉发展与优化迭代问题之钉钉每次消息发送都要查询路由服务带来的压力如何解决
|
6月前
|
算法 前端开发 Java
Bug复盘:接口异步返回的重要性
Bug复盘:接口异步返回的重要性
|
7月前
|
人工智能 自然语言处理 搜索推荐
梅俊:如何用好A1,轻松写好汇报、通知、复盘?
《如何用AI辅助高效写公文》课程由公文写作专家梅俊老师主讲,旨在帮助解决公文写作难题。课程涵盖广泛,不仅限于法定公文,还包括事务类公文,适合各类职场人士。梅俊老师结合15年写作经验和AI研究,提出7步法,包括问题拆解、信息分析、内容生成等,强调人与AI的协作,而非完全依赖AI。课程通过实例演示如何利用AI工具如kimichat和秘塔AI搜索提高写作效率,同时提醒用户需判断信息质量和内容质量。课程教授从初级到高级的14种公文写作,鼓励学员实践并形成“AI思维”。
322 1
|
7月前
|
Java 数据库连接 API
对象变更记录objectlog工具(持续跟新)
记录单个对象属性变化的日志工具,工具采用spring切面和mybatis拦截器相关技术编写了api依赖包,以非侵入方式实现对标记的对象属性进行记录,仅需要导入依赖即可,几乎不需要对原系统代码改动.
|
存储 程序员 容器
面试被问:ArrayList自动扩容机制的实现原理?怎么答?
一位3年工作经验的小伙伴面试时被问到,说请你谈一谈ArrayList自动扩容机制的实现原理。这个问题对于稍微看过一点源码的小伙伴来说,其实非常简单。下面我给大家分享一下我对这个问题的理解。
133 0
|
SQL 安全 前端开发
案例07-在线人员列表逻辑混乱-ThreadLocal、继承、索引失效
案例07-在线人员列表逻辑混乱-ThreadLocal、继承、索引失效
|
数据安全/隐私保护 Perl
生产实用命令集合,持续更新
生产实用命令集合,持续更新
74 0