我想知道的最好的方式来实现一个 正确的、灵活和快速等于在,可用于几乎任何类和情况.我想,一个专门的平等(把一个目的的实际类参数)是必要的性能。为了避免重复代码,一般的平等应该呼吁各专门平等的。空检查应当只进行一次,即使在继承的课程。

我终于做出了这样的设计:


class MyClass
{
    public Int32 SomeValue1 = 1;
    public Int32 SomeValue2 = 25;

    // Ignoring GetHashCode for simplicity.

    public override bool Equals(object obj)
    {
        return Equals (obj as MyClass);
    }

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

        if (!SomeValue1.Equals (obj.SomeValue1)) {
            return false;
        }

        if (!SomeValue2.Equals (obj.SomeValue2)) {
            return false;
        }

        return true;
    }
}

class MyDerivedClass : MyClass
{
    public Int32 YetAnotherValue = 2;

    public override bool Equals(object obj)
    {
        return Equals (obj as MyDerivedClass);
    }

    public bool Equals(MyDerivedClass obj)
    {
        if (!base.Equals (obj)) {
            return false;
        }

        if (!YetAnotherValue.Equals (obj.YetAnotherValue)) {
            return false;
        }

        return true;
    }
}

重要的想法:

  • 使用"如"经营者。这种方法我们没有检查null在一般的平等的。错误的类型,得到减少到空和将被排在专门的平等。
  • 空检查确切一点,即使对于源类别。
  • 检查的属性之一提供了一个明确的结构。

是有缺陷这一概念,或者我有没有错过任何条件?

有帮助吗?

解决方案

你等于方法不是反思的时候不同类型涉及:

MyDerivedClass mdc = new MyDerivedClass();
MyClass mc = new MyClass();
Object omdc = mdc;
Object omc = mc;

// mc.Equals(mdc) - true
// mdc.Equals(mc) - true by calling the right overload
// omc.Equals(omdc) - true
// omdc.Equals(omc) - false, the "as" in MyDerivedClass will result in null

正常来这是为了使用:

if (GetType() != other.GetType())
{
    return false;
}

看到文件在 对象。等于:"x。等(y)返回相同的价值为y。等(x)。" 依靠重载的给予不同的结果可以结束了 可怕的 问题将是非常细微的调试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top