对象Equals相等性比较的通用实现
最近编码的过程中,使用了对象本地内存缓存,缓存用了Dictionary<string,object>, ConcurrentDictionary<string,oject>,还可以是MemoryCache(底层基于Hashtable)。使用缓存,肯定要处理数据变化缓存同步的问题。如何比较数据的变化,演进为新的内存对象数据和已有内存对象数据的相等性比较!
对象的Equals相等性比较,百度、google会有一大堆实现,几个重点的点:
1. 实现接口IEquatable<T>
https://msdn.microsoft.com/en-us/library/ms131190(v=vs.110).aspx
2.重写bool Equals(object other)方法和 int GetHashCode()方法
http://stackoverflow.com/questions/2734914/whats-the-difference-between-iequatable-and-just-overriding-object-equals
这里直接贴出来一个通用实现,分享给大家:
1 /// <summary>2 /// 流控事件3 /// </summary>4 [Serializable]5 public class FlowControlEvent: IEquatable<FlowControlEvent>6 {7 public static readonly string Global = "Global";8 9 /// <summary>10 /// 标识11 /// </summary>12 public string ID { get; set; }13 14 /// <summary>15 /// 流控策略名称16 /// </summary>17 public string StrategyName { get; set; }18 19 /// <summary>20 /// 是否手工触发21 /// </summary>22 public bool IsManuelTrigger { get; set; }23 24 /// <summary>25 /// 触发时间26 /// </summary>27 public DateTime TriggerTime { get; set; } 28 29 /// <summary>30 /// 流控策略31 /// </summary>32 public FlowControlStrategy Strategy { get; set; }33 34 /// <summary>35 /// 持续时间,单位s36 /// </summary>37 public long Duration { get; set; }38 39 //是否启用40 private bool isEnable = true;41 42 /// <summary>43 /// 是否启用44 /// </summary>45 public bool IsEnable46 {47 get48 {49 return isEnable;50 }51 set52 {53 isEnable = value;54 }55 }56 57 /// <summary>58 /// 是否使用中59 /// </summary>60 public bool IsUsing61 {62 get63 {64 if (IsEnable == false) return false;65 if (IsManuelTrigger)66 {67 if (Duration == long.MaxValue)68 {69 return true;70 }71 else72 {73 var span = DateTime.Now - TriggerTime;74 if (span.TotalSeconds > Duration)75 return false;76 else77 return true;78 }79 }80 else81 {82 return true;83 }84 }85 }86 87 /// <summary>88 /// 创建时间89 /// </summary>90 public DateTime CreateTime { get; set; }91 92 /// <summary>93 /// 创建人94 /// </summary>95 public string Creator { get; set; }96 97 /// <summary>98 /// 最后修改时间99 /// </summary> 100 public DateTime LastModifyTime { get; set; } 101 102 /// <summary> 103 /// 最后修改人 104 /// </summary> 105 public string LastModifier { get; set; } 106 107 /// <summary> 108 /// 相等性比较 109 /// </summary> 110 /// <param name="other">要比较的对象</param> 111 /// <returns>true 相等 false 不相等</returns> 112 public override bool Equals(object other) 113 { 114 if (ReferenceEquals(null, other)) return false; 115 if (ReferenceEquals(this, other)) return true; 116 if (other.GetType() != this.GetType()) return false; 117 118 return Equals((FlowControlEvent)other); 119 } 120 121 /// <summary> 122 /// 流控事件是否等于同一类型的另一个流控事件 123 /// </summary> 124 /// <param name="other">同一类型的另一个流控事件</param> 125 /// <returns>true 相等 false 不相等</returns> 126 public bool Equals(FlowControlEvent other) 127 { 128 if (other == null) 129 return false; 130 if (!string.Equals(this.ID , other.ID) || this.IsEnable != other.IsEnable || this.Duration!= other.Duration 131 || !string.Equals(this.StrategyName, other.StrategyName)||this.TriggerTime!= other.TriggerTime) 132 return false; 133 134 return true; 135 } 136 137 /// <summary> 138 /// 重载GetHashCode方法 139 /// </summary> 140 /// <returns>HashCode</returns> 141 public override int GetHashCode() 142 { 143 unchecked 144 { 145 var result = 0; 146 result = (result * 397) ^ ID.GetHashCode(); 147 result = (result * 397) ^ IsEnable.GetHashCode(); 148 result = (result * 397) ^ Duration.GetHashCode(); 149 result = (result * 397) ^ StrategyName.GetHashCode(); 150 result = (result * 397) ^ TriggerTime.GetHashCode(); 151 return result; 152 } 153 } 154 }
周国庆
2017/4/25
转载于:https://www.cnblogs.com/yezuhui/p/6844387.html
对象Equals相等性比较的通用实现相关推荐
- .net框架读书笔记---通用对象操作(一)
接上一篇.net框架读书笔记---基础类型,这节主要学习这样正确实现所有对象都必须提供的一组通用操作---对象的等值性和唯一性: System.Object类型提供了一个名为Equals的虚方法,其目 ...
- hash 值重复_程序员:判断对象是否重复,不重写equals和hashcode不行吗?
前言 大家都知道如果要判断一个对象是否相同,都要在对象实体中重写equals和hashcode方法,那你知道为什么重写这两个方法就能根据自己定义的规则实现相等比较了吗? 今天带大家来了解一下equal ...
- 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
面试题汇总 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? hashCode 的常规协定: 1.在 Java 应用程序执行期间,在对同一对象多次调用 hashCo ...
- DDD理论学习系列(7)-- 值对象
[DDD理论学习系列--案例及目录:http://www.jianshu.com/p/6e2917551e63] 1.引言 提到值对象,我们可能立马就想到值类型和引用类型.而在C#中,值类型的代表是s ...
- DDD如何区分实体和值对象
前言 实体和值对象的区分是领域驱动设计中的老大难问题,建模过程中是必然会遇到的问题,我们在落地领域驱动设计过程中就遭遇了这类问题,下面介绍下我们落地过程中的经验. 实体 实体是指在你这个领域存在的一个 ...
- Java拾遗:001 - 重写 equals 和 hashCode 方法
2019独角兽企业重金招聘Python工程师标准>>> 重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被 ...
- hashcode()方法和equals()方法
一.hashcode()方法和equals()方法的介绍 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.eq ...
- 第9条:覆盖equals时总要覆盖hashCode
在每个覆盖equals方法的类中,也必须覆盖hashCode方法.否则,会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,包括HashMap,Hash ...
- equals 和 hashCode 到底有什么联系?一文告诉你
转载自 equals 和 hashCode 到底有什么联系?一文告诉你 写在前面 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方 ...
最新文章
- Rancher搭建NFS服务器
- USG防火墙单出口接入互联网
- recv函数_第五十二章、send和recv函数
- ROADS POJ - 1724(最短路+邻接表+dfs)
- python defaultdict 简单了解
- 逻辑运算和作用域的问题
- SQL Server中TEXT类型操作
- 电视机鸿蒙os卡,开卖40天,搭载鸿蒙OS操作系统的华为电视就差评如潮?用户:亏了...
- 2018.08.02 权限管理 笔记
- onload 事件、DOMContentLoaded事件、DOM加载顺序
- Ubuntu LVM扩展LV
- GoldenDict 上的那些精美版权词典(附下载地址)(英语、俄语、梵语、印地语)
- 时频分析之STFT:短时傅里叶变换的原理与代码实现(非调用Matlab API)
- Memcached damo
- poi怎么设置某个单元格为下拉框_java excel 多选下拉列表设置
- bindec() 函数
- 【Lesson 4】 和弦的大小增减属
- home为什么是地点副词_为什么home有副词的词性?
- python 解决问题的集合-No JSON object could be decoded
- 语义分割指标---MIoU详细介绍(原理及代码)