Почему возвращение false? новый Человек (“james”) == новый Человек (“james”)?

У меня есть переопределение 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;
    }
}
8
задан abatishchev 3 August 2010 в 11:17
поделиться

5 ответов

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

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

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

[...]

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

26
ответ дан 5 December 2019 в 04:58
поделиться

Да, dtb прав, вы хотите

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

вместо

2
ответ дан 5 December 2019 в 04:58
поделиться

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

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

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

2
ответ дан 5 December 2019 в 04:58
поделиться

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

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

5
ответ дан 5 December 2019 в 04:58
поделиться

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

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

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

См. Также

Связанные вопросы

2
ответ дан 5 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: