8

我已经覆盖GetHashCodeEquals并且两种方法都为不同的对象提供了相同的结果,但为什么仍然得到 false ?

class Program
{
    static void Main(string[] args)
    {    
        Console.WriteLine(new Person("james") == new Person("james"));    
        Console.ReadKey();
    }    
}

class Person
{
    private string Name;

    public Person(string name)
    {
        Name = name;
    }
    public override int GetHashCode()
    {
        return 1;
    }
    public override bool Equals(object obj)
    {
        return true;
    }
}
4

5 回答 5

26

因为==运算符默认引用相等。它不会调用您的Equals方法。

如果需要,您可以覆盖==运算符。请参阅:覆盖 Equals() 和运算符 == 的指南

在 C# 中,有两种不同的相等性:引用相等(也称为身份)和值相等。值相等是相等的一般理解含义:它意味着两个对象包含相同的值。例如,两个值为 2 的整数值相等。引用相等意味着没有两个对象可以比较。相反,有两个对象引用,它们都引用同一个对象。

[...]

默认情况下,运算符 == 通过确定两个引用是否指示同一个对象来测试引用是否相等。因此,引用类型不必实现 operator == 即可获得此功能。当一个类型是不可变的,即包含在实例中的数据不能改变时,重载运算符 == 来比较值相等而不是引用相等可能很有用,因为作为不可变对象,它们可以被认为与 long 相同因为它们具有相同的价值。在非不可变类型中覆盖 operator == 不是一个好主意。

于 2010-08-03T11:10:31.353 回答
5

==如果这确实是您想要的,您必须单独覆盖运算符。

http://msdn.microsoft.com/en-us/library/ms173147%28VS.80%29.aspx

于 2010-08-03T11:11:50.917 回答
2

==在这种情况下是一个引用相等运算符。它比较两个引用是否相同。

new运算符总是创建一个对象,因此 a永远new Something()不会对 another 的相同引用new Something()

您可以覆盖==运算符以执行值比较而不是引用比较。这就是例如String所做的。

也可以看看

相关问题

于 2010-08-03T11:12:22.010 回答
2

是的,你想要的 dtb 是对的

bool b = new Person("james").Equals(new Person("james")); 

反而

于 2010-08-03T11:12:23.570 回答
2

==运算符检查两个变量是否实际上是对内存中同一对象的字面引用。在您的示例中,您创建了两个James。他们可能是双胞胎(即他们可能有相同的记忆足迹),但他们不是同一个人(即他们有两个不同的记忆位置)。如果你写:

Person a = new Person("james");
Person b = a;
Console.WriteLine(a == b); 

你会得到true,因为 a 和 b 只是同一个 James 的两个名字。

于 2010-08-03T11:24:37.507 回答