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

如题, 你知道字典KEY对应的Value什么时候被覆盖了吗?

最近大家都在追.Net6 update,咱还是保持节奏,通用语言聊技术。

没背景说个铲铲

       上文中 数据获取组件维护了业务方所有(在用)的连接对象,DBA能在后台无侵入的切换备份库。

如何主动清空.NET数据库连接池?

上文中: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;
                    }
                }
            }
        }
    }
}

旁白:

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 、索引器的用法,基础不牢,地动山摇。

 性感豹纹

  三分钟掌握共享内存 & Actor并发模型

 如何主动清空.NET数据库连接池?

 鹅厂二面,Nginx回忆录

 Redis分布式锁抽丝剥茧

 看过这么多爆文,依旧走不好异步编程这条路?

 谁说docker-compose不能水平扩展容器、服务多实例?

 Kubernetes探针踩坑记

 难缠的布隆过滤器,这次终于通透了

由于微信公众号修改了推送规则,为便于大家及时收到我的不定时推送,加星标、一键三连互动、加好友(hihuangjun),不失为良策,就酱!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有态度的马甲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值