C # Я пытаюсь сравнить два разных объекта (сравниваю только идентичные подполя). Но у меня есть другое место, где есть проверка на нуль. Теперь у меня проблема, это проваливается в сравнении двух разных объектов, и это взрывается, потому что не ожидает null. Я попытался использовать новый метод для сравнения с объектом, но он не хочет его выбирать.
Является ли стандартной практикой при перегрузке операторов == или! = Сначала проверять какое-либо значение на null? Или есть способ сократить сравнение до нуля?
Ответ 1 · рейтинг 2 · StriplingWarrior
Стандартной практикой является проверка на null в операторах равенства. Возьмем, например, 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));
}
Ответ 2 · рейтинг 3 · drdwilcox
да. Вы должны проверить наличие null в своей перегрузке. И если вы перегрузите ==, вы должны перегрузить !=, а вам следует GetHashCode() и Equals().
Ответ 3 · рейтинг 1 · Rich O'Kelly
Вы не должны перегружать == это приводит к неинтуитивному коду. Просто придерживайтесь переопределения Equals (и GetHashCode)
Взято из Оператор перегрузки == по сравнению с Equals () (ответ Самуэля Неффа)
Когда у вас есть выражение
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, используется для определения того, какой метод используется для оценки ==.
Для сравнения Equals определяется во время выполнения на основе фактического типа в переменной x. Equals - это виртуальный метод объекта, который другие типы могут переопределять и переопределяют. Следовательно, оба следующих двух примера имеют значение true.
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