.net对象相等

时间:2010-03-04 14:04:54

标签: c# .net

让我们说我们有两个对象o1& o2定义为System.Object,在我的坐标o1& o2可以是以下任何一种类型:

  • 字符串
  • 的Int32
  • 布尔
  • 日期时间
  • 的DBNull

那么如何检查o1& o2是相同的,因此是相同的对象或两者具有相同的类型&值。

我可以o1 == o2或者我需要o1.Equals(o2)或其他吗?

谢谢,

AJ

5 个答案:

答案 0 :(得分:20)

我建议你使用

object.Equals(o1, o2)

因为这也将应对无效。 (假设您希望两个空引用比较相等。)

您应该使用==,因为运算符不是多态应用的;类型重载 ==但他们没有覆盖它(没有什么可以覆盖)。如果你使用

o1 == o2

将比较引用标识,因为变量被声明为object类型。

o1.Equals(o2)为空的情况下,使用o1除了,此时它会抛出NullReferenceException

答案 1 :(得分:4)

运算符==按引用比较对象,方法等于按值比较对象 例如:

StringBuilder s1 = new StringBuilder(“Yes”);

StringBuilder s2 = new StringBuilder(“Yes”);

Console.WriteLine(s1 == s2);

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

将显示:

False

True

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

答案 2 :(得分:1)

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

Jon提供了很好的解释,说明为什么这将是最佳用法。

答案 3 :(得分:1)

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

'=='对于类似下面的代码的内容会失败,因为对盒装对象的引用不一样:

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

编辑: 我注意到上面给出的stringbuilder示例,但由于您使用字符串并且它们的等式运算符被覆盖,它们实际上可以使用“==”或“.Equals”,以下代码

string s1 =“是”;

string s2 =“是”;

Console.WriteLine(s1 == s2);

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

输出 真正 真

答案 4 :(得分: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);
    }
}

这样,您可以确保自定义对象相同。