使用覆盖等于

时间:2016-04-01 05:07:54

标签: c#

最近我决定改用Equals方法。我主要使用MSDN指南(我相信更新的指南)。所以我的实现最终会像这样:

public class EqualityCheck
{
    public int Age { get; set; }
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }

    public override bool Equals(object obj)
    {
        if (null == obj)
        {
            return false;
        }

        //If obj is on of the expected type return false
        EqualityCheck ec = obj as EqualityCheck;
        if (null == ec)
        {
            return false;
        }

        //return true if the fields match. This is the place where we can decide what combination should be unique
        return (Age == ec.Age) && (Name == ec.Name) && (DateOfBirth == ec.DateOfBirth);

    }

    public bool Equals(EqualityCheck ec)
    {
        // If parameter is null return false:
        if (ec == null)
        {
            return false;
        }

        // Return true if the fields match:
        return (Age == ec.Age) && (Name == ec.Name);
    }
    //How to implement GetHashCode for complex object?      
}

还有一个孩子班:

public class EqualityCheckChild : EqualityCheck
{
    public int Height { get; set; }

    public override bool Equals(System.Object obj)
    {
        // If parameter cannot be cast to ThreeDPoint return false:
        EqualityCheckChild ec1 = obj as EqualityCheckChild;
        if (ec1 == null)
        {
            return false;
        }

        // Return true if the fields match:
        return base.Equals(obj) && Height == ec1.Height;
    }

    public bool Equals(EqualityCheckChild ec1)
    {
        // Return true if the fields match:
        return base.Equals((EqualityCheck)ec1) && Height == ec1.Height;
    }
    public static bool operator ==(EqualityCheckChild a, EqualityCheckChild b)
    {
        if (Equals(a, b))
        {
            return true;
        }

        if (a == null || b == null)
        {
            return false;
        }

        return a.DateOfBirth == b.DateOfBirth && a.Name == b.Name;
    }

    public static bool operator !=(EqualityCheckChild a, EqualityCheckChild b)
    {
        return !(a == b);
    }
}

我认为这就是MSDN所显示的实现,只是删除了强制转换。

我正在使用VS2015.NET 4.5.2。 VS标志着演员是多余的,那就是当我查看这个问题时。我已经读过可能的无限循环,只是出于好奇,我决定用上面的代码重新创建它。但是我不能重现它。

因为这不是复制粘贴代码。至少不是字面上的。我手工编写它试图理解我在做什么,所以我猜可能与原始代码有一些不匹配导致这种情况。但我的问题仍然存在 - 如何重现MSDN文章中提到的问题?

1 个答案:

答案 0 :(得分:1)

尝试将EqualityCheckChild的实例与null进行比较。

EqualityCheckChild foo = new EqualityCheckChild();
Console.WriteLine(foo == null);

此代码段将导致StackOverflowException,因为在operator==方法中,if (a == null || b == null)会调用自身。