最近编码的过程中,使用了对象本地内存缓存,缓存用了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