Оператор Overloading == по сравнению с Равняется ()

Perl:

sub is_palindrome {
    my $s = lc shift; # normalize case
    $s =~ s/\W//g;    # strip non-word characters
    return $s eq reverse $s;
}
44
задан Paul Roub 25 September 2015 в 20:17
поделиться

4 ответа

Я считаю, что стандартом является то, что для большинства типов .Equals проверяет сходство объектов, а оператор == проверяет ссылочное равенство.

Я считаю, что наилучшей практикой является то, что для неизменяемые типы, оператор == должен проверять сходство, как и .Equals . А если вы хотите узнать, действительно ли это один и тот же объект, используйте .ReferenceEquals . См. Пример этого в классе C # String .

28
ответ дан 26 November 2019 в 21:40
поделиться

Я не думаю, что для неизменяемых типов есть что-то плохое в том, что == перегружен для поддержки равенства значений. Однако я не думаю, что переопределил бы == без переопределения Equals , чтобы иметь ту же семантику. Если вы переопределяете == и по какой-то причине вам необходимо проверить равенство ссылок, вы можете использовать Object.ReferenceEquals (a, b) .

См. Эту статью Microsoft полезные рекомендации

7
ответ дан 26 November 2019 в 21:40
поделиться

Определенно пахнет. При перегрузке == вы должны убедиться, что оба Equals () и GetHashCode () также согласованы. См. рекомендации MSDN .

И единственная причина, по которой это кажется нормальным, заключается в том, что вы описываете свой тип как неизменяемый.

7
ответ дан 26 November 2019 в 21:40
поделиться

Существует большая разница между перегрузкой == и переопределением Equals.

Когда у вас есть выражение

if (x == y) {

Метод решение, которое будет использоваться для сравнения переменных x и y, будет принято во время компиляции . Это перегрузка оператора. Тип, используемый при объявлении x и y, используется для определения метода, используемого для их сравнения. Фактический тип в пределах x и y (т. Е. Подкласс или реализация интерфейса) не имеет значения. Рассмотрим следующее.

object x = "hello";
object y = 'h' + "ello"; // ensure it's a different reference

if (x == y) { // evaluates to FALSE

и следующее

string x = "hello";
string y = 'h' + "ello"; // ensure it's a different reference

if (x == y) { // evaluates to TRUE

Это демонстрирует, что тип, используемый для объявления переменных x и y, используется для определения того, какой метод используется для вычисления ==.

Для сравнения, Equals определяется в время выполнения на основе фактического типа в переменной x. Equals - это виртуальный метод объекта, который могут использовать другие типы, и сделать, переопределить. Поэтому оба следующих примера имеют значение true.

object x = "hello";
object y = 'h' + "ello"; // ensure it's a different reference

if (x.Equals(y)) { // evaluates to TRUE

и следующий

string x = "hello";
string y = 'h' + "ello"; // ensure it's a different reference

if (x.Equals(y)) { // also evaluates to TRUE
89
ответ дан 26 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

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