.NET对象的相等性

9
假设我们有两个对象o1和o2,它们都被定义为System.Object。在我的情况下,o1和o2可以是以下任何类型之一:
- 字符串 - Int32 - Double - 布尔值 - 日期时间 - DBNull
那么我该如何检查o1和o2是否相等,即它们是同一个对象或者它们具有相同的类型和值呢?
我可以只执行o1 == o2操作吗?还是需要执行o1.Equals(o2)或其他操作?
谢谢,
AJ
5个回答

20

我建议你使用

object.Equals(o1, o2)

假设您希望将两个空引用视为相等,那么您应该使用可以处理null值的equals方法。

不应该使用==,因为运算符不会多态应用;类型会重载==,但它们不会覆盖它(没有任何可以覆盖的内容)。如果您使用

o1 == o2

这将对它们进行引用标识比较,因为变量被声明为object类型。

使用o1.Equals(o2)将会正常工作,除非o1为空,在这种情况下,它会抛出一个NullReferenceException异常。


我想在完成我的回答之前应该刷新一下答案。 :) +1 - IAbstract

4

运算符==通过引用比较对象,而方法Equals通过值比较对象。
例如:

StringBuilder s1 = new StringBuilder(“Yes”);

StringBuilder s2 = new StringBuilder(“Yes”);

Console.WriteLine(s1 == s2);

Console.WriteLine(s1.Equals(s2));

将显示:

False

True

值对象可以通过 == 或 Equals 进行比较。


1

“Equals”应该适用于字符串和您列出的值类型。

以下代码中,“==”将失败,因为对装箱对象的引用不同:

        int x = 1;
        int y = 1;
        Object o1 = x;
        Object o2 = y;

编辑: 我注意到上面给出的StringBuilder示例,但由于您正在使用字符串并且它们的相等运算符被重写,它们实际上可以使用“==”或“.Equals”,以下代码
字符串s1 =“是”;
字符串s2 =“是”;
Console.WriteLine(s1 == s2);

Console.WriteLine(s1.Equals(s2));

输出 真 真


1

我会使用 Object.Equals(o1,o2) - 参考 MSDN

Jon提供了出色的解释,为什么这是最佳用法。


0
object.Equals(obj1, obj2) // This is the way prefered and the best practice for equality comparison.

因此,当处理自定义对象时(显然不是本例),您可能还应该考虑覆盖Equals方法。
public class Something {
    public long Id { get; set; }
    public string Name { get; set; }

    public override bool Equals(object obj) {
        if (obj == null)
            return false;

        if (((Something)obj) == null)
            return false;

        Something s = (Something)obj;

        return this.Id == s.Id && string.Equals(this.Name, s.Name);
    }

    public bool Equals(Something s) {
        if (s == null)
            return false;

        return this.Id == s.Id && string.Equals(this.Name, s.Name);
    }
}

这样做可以确保您的自定义对象相等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接