Возможный дубликат:
Как проверить нули в перегрузке оператора '== без бесконечной рекурсии?
Вероятно, это легкий ответ на этот вопрос... но, похоже, он ускользает от меня. Вот упрощенный пример:
public class Person
{
public string SocialSecurityNumber;
public string FirstName;
public string LastName;
}
Скажем, что для этого конкретного приложения справедливо сказать, что если числа социального обеспечения совпадают, и оба имени совпадают, то мы имеем в виду одного и того же "человека".
public override bool Equals(object Obj)
{
Person other = (Person)Obj;
return (this.SocialSecurityNumber == other.SocialSecurityNumber &&
this.FirstName == other.FirstName &&
this.LastName == other.LastName);
}
Чтобы все было согласовано, мы переопределяем и операторы == и!= для разработчиков в команде, которые не используют метод .Equals
.
public static bool operator !=(Person person1, Person person2)
{
return ! person1.Equals(person2);
}
public static bool operator ==(Person person1, Person person2)
{
return person1.Equals(person2);
}
Прекрасный и денди, верно?
Однако, что происходит, когда объект Person null
?
Вы не можете написать:
if (person == null)
{
//fail!
}
Так как это приведет к переопределению оператора ==, и код не будет выполнен:
person.Equals()
вызов метода, поскольку вы не можете вызвать метод для нулевого экземпляра.
С другой стороны, вы не можете явно проверить это условие внутри переопределения ==, так как это вызовет бесконечную рекурсию (и переполнение стека [dot com])
public static bool operator ==(Person person1, Person person2)
{
if (person1 == null)
{
//any code here never gets executed! We first die a slow painful death.
}
return person1.Equals(person2);
}
Итак, как вы переопределяете операторы == и!= для равенства значений и по-прежнему учитываете нулевые объекты?
Я надеюсь, что ответ не будет болезненно простым.: -)