面试官:实现一个带值变更通知能力的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 索引器的用法。
面试官:实现一个带值变更通知能力的Dictionary的更多相关文章
- 一张图,让你和面试官聊一个小时的“Java内存模型”
如果面试官问你:你了解 Java 内存模型吗? 你就可以使用这张图,按照这张图中的顺序和面试官开聊,正常情况下,聊一个小时是差不多的,这个时候,对你的处境是非常有益的,因为面试官的时间不多了.
- 面试官:一个 TCP 连接可以发多少个 HTTP 请求?
曾经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式 ...
- Sass--传一个带值的参数
在 Sass 的混合宏中,还可以给混合宏的参数传一个默认值,例如: @mixin border-radius($radius: 3px) { -webkit-border-radius: $radiu ...
- 懵圈了,面试官问一个 TCP 连接可发多少个 HTTP 请求?
作者:松若章 https://zhuanlan.zhihu.com/p/61423830 一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DO ...
- 面试官:一个TCP连接可以发多少个HTTP请求?
曾经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式.什 ...
- 面试问烂的 MySQL 查询优化,看完屌打面试官!
Java技术栈 ,一般把连接数设置得大一些). 并发量:同一时刻数据库服务器处理的请求数量 3.超高的 CPU使用率:CPU资源耗尽出现宕机. 4.磁盘 IO:磁盘 IO性能突然下降.大量消耗磁盘性能 ...
- 互联网公司的面试官是如何360°无死角考察候选人的?[z]
[z]https://juejin.im/post/5c0e47ebf265da614e2be9a7 一.写在前面 最近收到不少读者反馈,说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不 ...
- 攻略前端面试官(一):JS的数据类型和内存机制浅析
原文地址:http://rainykane.cn/2019/09/29/与K_K君一起攻略前端面试官(一):JS的数据类型和内存机制浅析/ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看 ...
- 【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!
写在前面 最近,一位读者出去面试前准备了很久,信心满满的去面试.没想到面试官的一个问题把他难住了.面试官的问题是这样的:如何使用Spring将Service注入到Servlet中呢?这位读者平时也是很 ...
随机推荐
- 使用Flash Builder 4.6出现 新建配置 失败 java.lang.NullPointerException错误
当看到这个错误的时候有点莫名奇妙的感觉,随后的第一反应是: 这跟我前些天安装的java的jre 1.8 有没有关联性.修改了设定,方法如下 "运行" -> "外部工 ...
- nginx限流模块(防范DDOS攻击)
Nginx限流模式(防范DDOS攻击) nginx中俩个限流模块: 1.ngx_http_limit_req_module(按请求速率限流) 2.ngx_http_limit_conn_module( ...
- [网络编程]mqtt概念&数据包
目录 前言 1. MQTT 简介 2. MQTT 通信模型 2.1 MQTT 协议 2.2 MQTT 协议中的订阅&主题&会话 2.3 MQTT 协议中的方法 3. MQTT 协议数据 ...
- Nginx:Nginx配置url重定向
符号含义: 正则表达式匹配: ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配: -f和!-f用来判断是否存在文件 -d和!-d用 ...
- C# 8.0和.NET Core 3.0高级编程 分享笔记三:控制流程和转换类型
控制流程和转换类型 本章的内容主要包括编写代码.对变量执行简单的操作.做出决策.重复执行语句块.将变量或表达式值从一种类型转换为另一种类型.处理异常以及在数值变量中检查溢出. 本章涵盖以下主题: 操作 ...
- (精)题解 guP2860 [USACO06JAN]冗余路径Redundant Paths
(写题解不容易,来我的博客玩玩咯qwq~) 该题考察的知识点是边双连通分量 边双连通分量即一个无向图中,去掉一条边后仍互相连通的极大子图.(单独的一个点也可能是一个边双连通分量) 换言之,一个边双连通 ...
- 重学 Spring Boot
什么是Spring Boot Spring Boot 是 Spring 开源组织下的一个子项目,也是 Spring 组件一站式解决方案,主要是为了简化使用 Spring 框架的难度和简化 Spring ...
- 成功解决1406, “Data too long for column ‘txt‘ at row 1“
这是因为数据库里该字段的数据类型所给的数据空间太小.MySQL将截断超过指定列宽度的任何插入值.为了让这个不报错,可以尝试切换MySQL模式不使用严格模式. SET @@global.sql_mode ...
- pytorch中网络特征图(feture map)、卷积核权重、卷积核最匹配样本、类别激活图(Class Activation Map/CAM)、网络结构的可视化方法
目录 0,可视化的重要性: 1,特征图(feture map) 2,卷积核权重 3,卷积核最匹配样本 4,类别激活图(Class Activation Map/CAM) 5,网络结构的可视化 0,可视 ...
- deepin解压乱码
使用unzip命令解压:unzip -O GBK xxxx.zip -d xxx