Добавлены перегрузки операторов для сравнения двух разных объектов.Теперь не могу проверить на ноль - PullRequest
1 голос
/ 18 ноября 2011

C # Я пытаюсь сравнить два разных объекта (я сравниваю только идентичные подполя). Но у меня есть другое место, где есть проверка на ноль. Теперь у меня есть проблема, она сводится к сравнению двух разных объектов, и это взрывается, потому что он не ожидает ноль. Я пытался поставить новый метод для сравнения с объектом, но он не хочет выбирать тот.

Является ли общепринятой практикой при перегрузке операторов == или! = Сначала проверять наличие нуля? Или есть какой-нибудь способ сократить сравнение до нуля?

Ответы [ 3 ]

3 голосов
/ 18 ноября 2011

Да.Вы должны проверить на ноль в вашей перегрузке.И если вы перегрузите ==, вы должны перегрузить !=, а вы должны GetHashCode() и Equals().

2 голосов
/ 18 ноября 2011

Обычной практикой является проверка на нулевое значение в операторах равенства. Возьмите String, например:

public static bool operator ==(string a, string b)
{
    return string.Equals(a, b);
}

public static bool Equals(string a, string b)
{
    return a == b || (a != null && b != null && string.EqualsHelper(a, b));
}
1 голос
/ 18 ноября 2011

Не следует перегружать == это приводит к неинтуитивному коду.Просто придерживайтесь переопределения Equals (и GetHashCode)

Взято из Оператор перегрузки == против Equals () (ответ Сэмюэля Неффа) * ​​1005 *

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

x == y

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

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

и следующее

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

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

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

object x = "hello"; object y = 'h' + "ello"; // ensure it's a different reference
x.Equals(y) // evaluates to TRUE

и следующие

string x = "hello"; string y = 'h' + "ello"; // ensure it's a different reference
x.Equals(y) // also evaluates to TRUE
...