У меня есть переопределение 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;
}
}
Поскольку оператор ==
по умолчанию ссылается на равенство. Он не вызывает ваш метод Equals
.
Вы можете переопределить оператор ==
, если хотите. См .: Рекомендации по переопределению Equals () и Operator ==
В C # существует два разных вида равенства: ссылочное равенство (также известное как идентичность) и равенство значений. Равенство значений - это общепринятый смысл равенства: это означает, что два объекта содержат одинаковые значения. Например, два целых числа со значением 2 имеют равенство значений. Ссылочное равенство означает, что нет двух объектов для сравнения. Вместо этого есть две объектные ссылки, и обе относятся к одному и тому же объекту.
[...]
По умолчанию оператор == проверяет равенство ссылок, определяя, указывают ли две ссылки на один и тот же объект. Следовательно, ссылочные типы не должны реализовывать operator ==, чтобы получить эту функциональность. Когда тип неизменяемый, то есть данные, содержащиеся в экземпляре, не могут быть изменены, перегрузка operator == для сравнения равенства значений вместо ссылочного равенства может быть полезна, потому что, как неизменяемые объекты, они могут считаться такими же, как и long поскольку они имеют одинаковую ценность. Не рекомендуется переопределять operator == в неизменяемых типах.
Да, dtb прав, вы хотите
bool b = new Person("james").Equals(new Person("james"));
вместо
Оператор ==
проверяет, действительно ли две переменные в буквальном смысле ссылки на один и тот же объект в памяти. В вашем примере вы создаете два Джеймса. Они могут быть близнецами (т. Е. Иметь одинаковый объем памяти), но это не один и тот же человек (т. Е. У них два разных места в памяти). Если вы напишете:
Person a = new Person("james");
Person b = a;
Console.WriteLine(a == b);
, вы получите истину
, потому что a и b - всего лишь два имени для одного и того же Джеймса.
Вы должны отдельно переопределить оператор ==
, если это действительно то, что вам нужно.
http://msdn.microsoft.com/en-us/library/ms173147%28VS.80%29.aspx
==
- эталонное равенство оператор в этом случае. Он сравнивает, если две ссылки идентичны.
Оператор new
всегда создает объект new , поэтому new Something ()
НИКОГДА не будет идентичной ссылкой на другой Новое Что-то ()
.
Вы можете переопределить оператор ==
для выполнения сравнения значений вместо сравнения ссылок. Вот что, например, Строка
делает.