Int32.Equals vs'=='运算符

Ana*_*eer 3 c# operators

我环顾四周,但之前似乎没有人问过这个问题,所以在这里.

我正在开发一个具有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

是的,使用==运算符绝对没问题,只要编译时类型Orderint.

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或者Namenull,在一个明显的方式(空引用是彼此相等并且不等于任何非空引用).您的现有代码将抛出NullReferenceExceptionif到达this.Value.Equalsthis.Name.Equalsnull属性值.(很可能你确保从未如此,但值得注意.)

您还应该确保您的哈希代码与相等一致,并且也可以覆盖Equals(object).