首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么返回false?新的人(“james”) ==新的人(“james”)?

为什么返回false?新的人(“james”) ==新的人(“james”)?
EN

Stack Overflow用户
提问于 2010-08-03 19:09:33
回答 5查看 754关注 0票数 8

我已经覆盖了GetHashCodeEquals,这两个方法对不同的对象提供了相同的结果,但是为什么仍然得到false呢?

代码语言:javascript
复制
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;
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-08-03 19:10:31

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

如果需要,可以覆盖==操作符。请参阅:Guidelines for Overriding Equals() and Operator ==

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

..。

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

票数 26
EN

Stack Overflow用户

发布于 2010-08-03 19:11:51

如果这确实是您想要的,那么您必须单独覆盖==操作符。

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

票数 5
EN

Stack Overflow用户

发布于 2010-08-03 19:12:22

在本例中,==是一个引用相等运算符。它比较两个引用是否相同。

new操作符总是创建一个新对象,因此new Something()永远不会是对另一个new Something()的完全相同的引用。

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

另请参阅

  • MSDN - C# Programming Guide - Guidelines for Overriding Equals() and Operator ==

相关问题

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3395887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档