C# 우선 순위는 "AS"및 정확성, 유연성 및 성능을위한 전문적인 방법을 사용하는 것과 동일합니다.

StackOverflow https://stackoverflow.com/questions/460846

문제

나는 구현하는 가장 좋은 방법에 대해 궁금했다 C#에서 정확하고 유연하며 빠른 속도로, 실질적으로 모든 클래스와 상황에 사용할 수 있습니다.. 성능을 위해서는 특수 평등 (실제 클래스의 객체를 매개 변수로 취 함)이 필요하다고 생각했습니다. 코드 복제를 피하기 위해 일반 평등은 특수 평등을 호출해야합니다. 상속 클래스에서도 널 검사는 한 번만 수행해야합니다.

마침내이 디자인을 생각해 냈습니다.


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

중요한 아이디어 :

  • "AS"연산자의 사용. 이런 식으로 우리는 일반적인 평등에서 널을 점검 할 필요가 없습니다. 잘못된 클래스 유형은 NULL로 축소되며 특수 평등에서 분류됩니다.
  • 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;
}

문서를 참조하십시오 Object.equals: "X.equals (y)는 y.equals (x)와 동일한 값을 반환합니다." 다른 결과를 제공하기 위해 과부하에 의존하면 무섭게 디버그에 매우 미묘한 문제.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top