Подтвердить что ты не робот

С#: реализация по умолчанию для операторов == и!= Для объектов

Я хотел бы знать, что такое реализация по умолчанию для оператора равенства (== и! =)

Это?

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?

4b9b3361

Ответ 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

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