我环顾四周,但之前似乎没有人问过这个问题,所以在这里.
我正在开发一个具有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));
}
Run Code Online (Sandbox Code Playgroud)
其中Value,Name和Order是QueryFilter类的字段.值和名称是strings,但Order是一个int,我想知道使用==运算符是否正常,或者我是否应该使用该Int32.Equals方法,以"匹配"其他字段如何进行比较?我检查了MSDN,但它没有详细说明,只是说它超载了,但我不确定在这种情况下这意味着什么.那==将是唯一一个在工作的人吗?
总而言之,哪一个更好?Int32.Equals还是==?我什么时候应该使用每一个?
Jon*_*eet 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;
}
Run Code Online (Sandbox Code Playgroud)
......我当然希望看到.
这还处理的情况下Value或者Name是null,在一个明显的方式(空引用是彼此相等并且不等于任何非空引用).您的现有代码将抛出NullReferenceExceptionif到达this.Value.Equals或this.Name.Equalsnull属性值.(很可能你确保从未如此,但值得注意.)
您还应该确保您的哈希代码与相等一致,并且也可以覆盖Equals(object).