可能重复:
How do I check for nulls in an ‘==’ operator overload without infinite recursion?
对于this...but,可能有一个简单的答案,它似乎让我难以理解。下面是一个简化的示例:
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()
方法调用,因为您不能在空实例上调用方法。
另一方面,您不能在==覆盖中显式地检查此条件,因为它将导致无限递归(以及Stack Overflow .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);
}
那么,如何覆盖==和!=运算符以实现值相等,并仍然考虑空对象呢?
我希望答案不是简单得令人痛苦。:-)
发布于 2010-11-19 04:31:39
使用object.ReferenceEquals(person1, null)
或新的is operator代替==
运算符:
public static bool operator ==(Person person1, Person person2)
{
if (person1 is null)
{
return person2 is null;
}
return person1.Equals(person2);
}
发布于 2010-11-19 04:32:26
你可以随时重写并放入
(Object)(person1)==null
我可以想象这会起作用,但不确定。
发布于 2010-11-19 10:17:24
使用这些方法比使用任何一种方法都要简单
public static bool operator ==(Person person1, Person person2)
{
EqualityComparer<Person>.Default.Equals(person1, person2)
}
这与其他人提出的方法具有相同的空等式语义,但框架的问题在于找出细节:)
https://stackoverflow.com/questions/4219261
复制相似问题