Int32.Equals vs'=='运算符

时间:2014-03-06 20:05:08

标签: 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));
    }

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

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

1 个答案:

答案 0 :(得分:16)

是的,使用==运算符绝对没问题,只要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的情况(空引用彼此相等且不等于任何非空引用)。如果现有代码的空属性值达到NullReferenceExceptionthis.Value.Equals,则会抛出this.Name.Equals。 (很可能你确保从未如此,但值得注意。)

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