Зачем возвращать ложь?new Person ("james") == new Person ("james")? - PullRequest
8 голосов
/ 03 августа 2010

У меня есть переопределение 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;
    }
}

Ответы [ 5 ]

26 голосов
/ 03 августа 2010

Поскольку оператор == по умолчанию равен ссылочному равенству. Он не вызывает ваш Equals метод.

Вы можете переопределить оператор ==, если хотите. См .: Рекомендации по переопределению Equals () и оператора ==

В C # существует два различных типа равенства: ссылочное равенство (также известное как идентичность) и равенство значений. Ценность равенства - это общепринятый смысл равенства: это означает, что два объекта содержат одинаковые значения. Например, два целых числа со значением 2 имеют значение равенства. Ссылочное равенство означает, что нет двух объектов для сравнения. Вместо этого есть две ссылки на объекты, и обе они ссылаются на один и тот же объект.

[...]

По умолчанию оператор == проверяет равенство ссылок, определяя, указывают ли две ссылки на один и тот же объект. Следовательно, ссылочные типы не должны реализовывать оператор == для получения этой функциональности. Когда тип является неизменяемым, то есть данные, содержащиеся в экземпляре, не могут быть изменены, может быть полезен оператор перегрузки == для сравнения равенства значений вместо ссылочного равенства, поскольку в качестве неизменяемых объектов они могут рассматриваться как длинные так как они имеют одинаковое значение. Не рекомендуется переопределять оператор == в неизменяемых типах.

5 голосов
/ 03 августа 2010

Вы должны отдельно переопределить оператор ==, если это действительно то, что вам нужно.

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

2 голосов
/ 03 августа 2010

Оператор == проверяет, являются ли две переменные в действительности буквальными ссылками на один и тот же объект в памяти.В вашем примере вы создаете два Джеймса.Они могут быть близнецами (то есть они могут иметь одинаковый объем памяти), но это не одно и то же лицо (то есть у них две разные области памяти).Если бы вы написали:

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

, вы бы получили true, потому что a и b - это только два имени одного и того же Джеймса.

2 голосов
/ 03 августа 2010

Да, ДТБ правильно, вы хотите

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

вместо

2 голосов
/ 03 августа 2010

== является оператором равенства ссылок в этом случае.Он сравнивает, совпадают ли две ссылки.

Оператор new всегда создает новый объект, поэтому new Something() будет НИКОГДА не быть идентичной ссылкой на другуюnew Something().

Вы можете переопределить оператор == для сравнения значений вместо сравнения ссылок.Вот что делает, например, String.

См. Также

Смежные вопросы

...