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
值,就可以了。
请注意,对Name
和Value
执行此操作也很好 – 再次,假设这些属性的编译时类型是string
(因为编译器使用string
提供的重载。然后您可以使用&&
短的事实 -电路化,摆脱不必要的括号,并留下:
public bool Equals(QueryFilter other) { return other != null && this.Value == other.Value && this.Name == other.Name && this.Order == other.Order; }
……我当然更愿意看到。
这也以一种显而易见的方式处理Value
或Name
为null
的情况(空引用彼此相等且不等于任何非空引用)。 如果现有代码达到this.Value.Equals
或this.Name.Equals
为null属性值,则会抛出NullReferenceException
。 (很可能你确保从未如此,但值得注意。)
您还应该确保哈希代码与相等一致,并重写Equals(object)
。