我环顾四周,但之前似乎没有人问过这个问题,所以就这样了。
我正在开发一个具有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类的字段。值和名称为strings
,但订单为int
,我想知道使用==
运算符是否合适,或者我是否应该使用Int32.Equals
方法, “匹配”其他领域如何进行比较?我检查了MSDN,但它没有详细说明,只是说它超载了,但我不确定在这种情况下这意味着什么。 ==
总是在工作吗?
总之,哪一个更好? Int32.Equals
或==
?我什么时候应该使用每一个?
答案 0 :(得分:16)
是的,使用==
运算符绝对没问题,只要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
的情况(空引用彼此相等且不等于任何非空引用)。如果现有代码的空属性值达到NullReferenceException
或this.Value.Equals
,则会抛出this.Name.Equals
。 (很可能你确保从未如此,但值得注意。)
您还应该确保哈希码与相等一致,并覆盖Equals(object)
。