С#: реализация по умолчанию для операторов == и!= Для объектов
Я хотел бы знать, что такое реализация по умолчанию для оператора равенства (== и! =)
Это?
public static bool operator ==(object obj1, object obj2)
{
return obj1.Equals(obj2);
}
public static bool operator !=(object obj1, object obj2)
{
return !obj1.Equals(obj2);
}
Итак, мне нужно только переопределить метод Equals или мне нужно также переопределить операторы euality?
Ответы
Ответ 1
Нет, это не так - по умолчанию ссылки проверяются на равенство. Операторы, такие как ==
, не являются полиморфными и не вызывают ничего полиморфного по умолчанию. Так, например:
string x = "Hello";
string y = new String("Hello".ToCharArray());
Console.WriteLine(x == y); // True; uses overloaded operator
object a = x;
object b = y;
Console.WriteLine(a == b); // False; uses default implementation
Вы не можете переопределить операторы равенства, но вы можете перегрузить их, как это делает строка. Нужен ли вам другой вопрос. Я думаю, что обычно бывало, если бы я переопределял Equals
, но не обязательно всегда.
Ответ 2
спецификация языка С#, раздел 7.9 описывает точное поведение встроенного оператора ==
. Например, при использовании ==
для значений ссылочного типа применяется следующий раздел:
7.9.6 Операторы равенства ссылочного типа
Предопределенные операторы равенства ссылочного типа:
bool operator ==(object x, object y);
bool operator !=(object x, object y);
Операторы возвращают результат сравнения двух ссылок для равенства или неравномерности.
Поскольку предопределенные операторы равенства ссылочного типа принимают операнды объекта типа, они применяются ко всем типам, которые не объявляют применимый оператор == и operator!= members. И наоборот, любые применимые пользовательские операторы равенства эффективно скрывают предопределенные операторы равенства ссылочного типа.
[Подробнее пропустите...]
Обратите внимание, что "сравнение двух ссылок для равенства" не означает "результат вызова obj1.Equals(obj2)
". Это означает, что обе ссылки должны указывать на один и тот же объект (ссылочное равенство).
Ответ 3
По умолчанию эти операторы проверяют равенство ссылки.