繁体   English   中英

平等比较对象

[英]Equality comparing objects

我有这样的代码:

 public bool AreSame(CreditProposal creditProposal)
    {
        if (!ContractingParty.Equals(creditProposal.ContractingParty))
            return false;
        if (!UltimateParent.Equals(creditProposal.UltimateParent))
            return false;
        if (!Rebound.Equals(creditProposal.Rebound))
            return false;
        if (!ContactPerson.Equals(creditProposal.ContactPerson))
            return false;
        if (!DateOfVisit.Equals(creditProposal.DateOfVisit))
            return false;
      .... and so on 10 more times

有没有一种方法可以更简洁? 还是那意味着我进入反思地狱?

覆盖Equals方法。

在MSDN上检查

并注意, If you implement ==, you must implement !=

处理这种情况的本能方法是重写Object.Equals(Object)方法并为您的类型实现IEquatable<T>

但是,重写Object.Equals将提示您也重写Object.GetHashCode() ,这很难正确完成。 最值得注意的是,每次在同一实例上调用GetHashCode()必须返回相同的值,并且对于被视为相等的两个对象,必须返回相同的值。 如果您的类型是易变的,这将成为真正的痛苦。 (实际上, GetHashCode()很难正确实现,在StackOverflow上有一个完整的标签: https ://stackoverflow.com/questions/tagged/gethashcode)

Equals的静态实现通常如下所示:

public static bool Equals(CreditProposal proposalA, CreditProposal proposalB)
{
    // Check whether both values are null.
    if(object.ReferenceEquals(proposalA, null) 
        && object.ReferenceEquals(proposalB, null))
    {
        return true;
    }

    // Check whether either value is null.
    if(object.ReferenceEquals(proposalA, null) 
        || object.ReferenceEquals(proposalB, null))
    {
        return false;
    }

    // Check whether hashcodes are different.
    if(proposalA.GetHashCode() != proposalB.GetHashCode())
    {
        return false;
    }

    // Check for value equality.
    return Party.Equals(
            proposalA.ContractingParty, 
            proposalB.ContractingParty)
        && ParentProposal.Equals(
            proposalA.UltimateParent, 
            proposalB.UltimateParent);
        // Add more conditions for equality here.
}

您将从所有实例方法中调用此实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM