Int32.Equals vs’==’运算符

我环顾四周,但似乎没有人问过这个问题,所以就这样了。

我正在开发一个具有IEquatable接口的自定义类,因此我正在创建自己的Equals方法。 这是它的样子:

 public bool Equals(QueryFilter qfilter) { if (qfilter == null) { return false; } return ((this.Value.Equals(qfilter.Value)) && (this.Name.Equals(qfilter.Name)) && (this.Order == qfilter.Order)); } 

其中Value,Name和Order是QueryFilter类的字段。 Value和Name是strings ,但Order是一个int ,我想知道是否使用==运算符,或者我是否应该使用Int32.Equals方法,以“匹配”其他字段如何进行比较? 我检查了MSDN,但它没有详细说明,只是说它超载了,但我不确定在这种情况下这意味着什么。 那个==会一直在工作吗?

总而言之,哪一个更好? Int32.Equals还是== ? 什么时候应该使用每一个?

是的,使用==运算符是绝对正确的,只要Order编译时类型是int

例如,如果编译时类型是object ,那么您将处理盒装 int值并将这些框与引用相等性进行比较,这不是您所追求的。 但只要编译器知道它们是int值,就可以了。

请注意,对NameValue执行此操作很好 – 再次,假设这些属性的编译时类型是string (因为编译器使用string提供的重载。然后您可以使用&&短的事实 -电路化,摆脱不必要的括号,并留下:

 public bool Equals(QueryFilter other) { return other != null && this.Value == other.Value && this.Name == other.Name && this.Order == other.Order; } 

……我当然更愿意看到。

这也以一种显而易见的方式处理ValueNamenull的情况(空引用彼此相等且不等于任何非空引用)。 如果现有代码达到this.Value.Equalsthis.Name.Equals为null属性值,则会抛出NullReferenceException 。 (很可能你确保从未如此,但值得注意。)

您还应该确保哈希代码与相等一致,并重写Equals(object)