用 Equals() 覆盖相等运算符
Override the equality operators with Equals()
我已经调试一个问题很长时间了,我意识到它是由于在我本应使用 object.Equals()
[=15= 的对象上使用 ==
引起的]
为了防止此类问题,希望 ==
操作员调用我已覆盖的 Object.Equals()
。
这可能吗?以下代码遇到 Stack-overflow 异常...
public static bool operator ==(Portfolio a, Portfolio b)
{
return a != null && a.Equals(b);
}
public static bool operator !=(Portfolio a, Portfolio b)
{
return a != null && !a.Equals(b);
}
谢谢!
您从 !=
运算符递归调用 !=
运算符,因此堆栈溢出。使用 ReferenceEquals
代替:
public static bool operator !=(Portfolio a, Portfolio b)
{
return !object.ReferenceEquals(a, null) && !a.Equals(b);
}
就是说,这段代码是有缺陷的,因为如果 a
为 null 而 b
不是,它将 return false
。您应该检查两个对象是否为空:
public static bool operator !=(Portfolio a, Portfolio b)
{
if (object.ReferenceEquals(a, null))
{
return !object.ReferenceEquals(b, null);
}
return !a.Equals(b);
}
我已经调试一个问题很长时间了,我意识到它是由于在我本应使用 object.Equals()
[=15= 的对象上使用 ==
引起的]
为了防止此类问题,希望 ==
操作员调用我已覆盖的 Object.Equals()
。
这可能吗?以下代码遇到 Stack-overflow 异常...
public static bool operator ==(Portfolio a, Portfolio b)
{
return a != null && a.Equals(b);
}
public static bool operator !=(Portfolio a, Portfolio b)
{
return a != null && !a.Equals(b);
}
谢谢!
您从 !=
运算符递归调用 !=
运算符,因此堆栈溢出。使用 ReferenceEquals
代替:
public static bool operator !=(Portfolio a, Portfolio b)
{
return !object.ReferenceEquals(a, null) && !a.Equals(b);
}
就是说,这段代码是有缺陷的,因为如果 a
为 null 而 b
不是,它将 return false
。您应该检查两个对象是否为空:
public static bool operator !=(Portfolio a, Portfolio b)
{
if (object.ReferenceEquals(a, null))
{
return !object.ReferenceEquals(b, null);
}
return !a.Equals(b);
}