对象Equals相等性比较的通用实现

Posted 叶祖辉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象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         /// 持续时间,单位s
 36         /// </summary>
 37         public long Duration { get; set; }
 38 
 39         //是否启用
 40         private bool isEnable = true;
 41 
 42         /// <summary>
 43         /// 是否启用
 44         /// </summary>
 45         public bool IsEnable
 46         {
 47             get
 48             {
 49                 return isEnable;
 50             }
 51             set
 52             {
 53                 isEnable = value;
 54             }
 55         }
 56 
 57         /// <summary>
 58         /// 是否使用中
 59         /// </summary>
 60         public bool IsUsing
 61         {
 62             get
 63             {
 64                 if (IsEnable == false) return false;
 65                 if (IsManuelTrigger)
 66                 {
 67                     if (Duration == long.MaxValue)
 68                     {
 69                         return true;
 70                     }
 71                     else
 72                     {
 73                         var span = DateTime.Now - TriggerTime;
 74                         if (span.TotalSeconds > Duration)
 75                             return false;
 76                         else
 77                             return true;
 78                     }
 79                 }
 80                 else
 81                 {
 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

 

以上是关于对象Equals相等性比较的通用实现的主要内容,如果未能解决你的问题,请参考以下文章

Java对象相等比较(Equals)

JAVA中,为啥object对象中的equals方法比较的是同一,而String对象比较的是相等?

Object Equals && GetHashCode

C# - 常用类

Effective java -- 2 对于所有对象都通用到方法

java map key可以重复吗