C #: реализация по умолчанию для операторов == и! = Для объектов - PullRequest
19 голосов
/ 08 сентября 2011

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

Это?

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?

Ответы [ 3 ]

27 голосов
/ 08 сентября 2011

Нет, это , а не , по умолчанию ссылки проверяются на равенство.Такие операторы, как ==, не полиморфны и по умолчанию не вызывают ничего полиморфного.Например:

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, но не всегда всегда.

6 голосов
/ 08 сентября 2011

Спецификация языка C # , раздел 7.9, описывает точное поведение встроенного оператора ==.Например, при использовании == для значений ссылочного типа применяется следующий раздел:

7.9.6 Операторы равенства типов ссылок

Предопределенная ссылкаоператоры равенства типов:

bool operator ==(object x, object y);bool operator !=(object x, object y);

Операторы возвращают результат сравнения двух ссылок на равенство или неравенство.

Поскольку предопределенные операторы равенства ссылочного типа принимают операнды объекта типа, они применяются ко всем типамкоторые не объявляют соответствующих операторов operator == и operator! =.И наоборот, все применимые пользовательские операторы равенства эффективно скрывают предопределенные операторы равенства ссылочного типа.

[Подробности пропущены ...]

Обратите внимание, что " сравнивает две ссылкидля равенства"не означает" результат вызова obj1.Equals(obj2) ".Это означает, что обе ссылки должны указывать на один и тот же объект ( равенство ссылок ).

3 голосов
/ 08 сентября 2011

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

...