为何回归虚假?新人("詹姆斯")==新人("詹姆斯")?

Fre*_*ood 8 .net c# equals gethashcode

我有覆盖GetHashCode,Equals并且两种方法为不同的对象提供相同的结果,但为什么仍然得到假?

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

dtb*_*dtb 26

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

您可以根据需要覆盖==操作员.请参阅:覆盖等于()和运算符==的指南

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

[...]

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

  • 第1步:框架读取对象1的内存地址.第2步:框架读取对象2的内存地址.第3步:数字是否相等?第4步:拼写为"你". (9认同)

Nic*_*ick 5

==如果这真的是你想要的,你必须单独覆盖操作符.

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


归档时间:

查看次数:

728 次

最近记录:

16 年,2 月 前