用Equals()覆盖相等运算符

时间:2016-06-22 06:22:53

标签: c# operators override equality

我已经调试了一段时间的问题并意识到它来自于==在我应该使用object.Equals()

的对象上的使用

为了防止此类问题,我希望==运算符调用我已覆盖的Object.Equals()

这可能吗?以下代码遇到堆栈溢出异常...

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);
}

谢谢!

1 个答案:

答案 0 :(得分:6)

您从!=运算符递归调用!=运算符,因此堆栈溢出。请改用ReferenceEquals

public static bool operator !=(Portfolio a, Portfolio b)
{
    return !object.ReferenceEquals(a, null) && !a.Equals(b);
}

也就是说,此代码存在缺陷,因为如果false为空并且a不是b,它将返回public static bool operator !=(Portfolio a, Portfolio b) { if (object.ReferenceEquals(a, null)) { return !object.ReferenceEquals(b, null); } return !a.Equals(b); } 。您应该检查两个对象是否为null:

$arrs['Name1'] = array(
    3,4,3
 );
 $arrs['Name2'] = array(
    11,2
 ); 

$count_status = array();
 foreach($arrs as $index=>$arr){
    $sum = 0;
    foreach($arr as $key=>$arrss){      
        isset($arrs[$index]) ? $count_status[$index] = $sum+=$arrss : $sum = 0;
    }
    $allVal[$index] = implode('+',$arr);
 }
 foreach($count_status as $stKey=>$eachCount){
     echo $stKey.' - '.$eachCount.' ('.$allVal[$stKey].') <br>';
 }