C# .net对象相等性

C# .net对象相等性,c#,.net,C#,.net,假设我们有两个对象o1和o2被定义为System。对象,在我的情况下o1和o2可以是以下任何类型: 串 Int32 双重的 布尔值 日期时间 DBNull 那么我如何检查o1和o2是相等的,因此是相同的对象,或者两者具有相同的类型和值 我可以只做o1==o2吗,或者我需要做o1.Equals(o2)或者其他什么吗 谢谢 AJ我建议您使用 object.Equals(o1, o2) 因为这也将解决无效问题。(假设您希望两个空引用进行相等的比较。) 您不应该使用==,因为运算符不是多态应用的;

假设我们有两个对象o1和o2被定义为System。对象,在我的情况下o1和o2可以是以下任何类型:

  • Int32
  • 双重的
  • 布尔值
  • 日期时间
  • DBNull
那么我如何检查o1和o2是相等的,因此是相同的对象,或者两者具有相同的类型和值

我可以只做
o1==o2
吗,或者我需要做
o1.Equals(o2)
或者其他什么吗

谢谢


AJ

我建议您使用

object.Equals(o1, o2)
因为这也将解决无效问题。(假设您希望两个空引用进行相等的比较。)

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

o1 == o2
这将比较它们的引用标识,因为变量被声明为
object
类型


使用
o1.Equals(o2)
将起作用,除非
o1
为空-此时它将抛出
NullReferenceException
我将使用
对象.Equals(o1,o2)
-ref


Jon很好地解释了为什么这是最好的用法。

操作符==通过引用比较对象,方法等于通过值比较对象。
例如:

StringBuilder s1 = new StringBuilder(“Yes”);

StringBuilder s2 = new StringBuilder(“Yes”);

Console.WriteLine(s1 == s2);

Console.WriteLine(s1.Equals(s2));
将显示:

False

True

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

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

“==”将失败,原因是对装箱对象的引用不相同:

        int x = 1;
        int y = 1;
        Object o1 = x;
        Object o2 = y;
编辑: 我注意到上面给出的stringbuilder示例,但是由于您使用的是字符串,并且它们的相等运算符被覆盖,因此它们实际上可以使用“==”或“.Equals”来工作,下面的代码

字符串s1=“是”

字符串s2=“是”

Console.WriteLine(s1==s2)

控制台写入线(s1等于(s2))

输出 真的 真的

因此,您也可以考虑在使用自定义对象时重写ErrAs方法(而不是在这里出现的情况)。


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

我想我应该在完成答案之前刷新答案。:)+1.
object.Equals(obj1, obj2) // This is the way prefered and the best practice for equality comparison.
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);
    }
}