C# الغالبة يساوي باستخدام "كما" المتخصصة طريقة صحة المرونة و الأداء

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

سؤال

كنت أتساءل حول أفضل طريقة لتنفيذ الصحيح ومرنة وسريعة يساوي في C#, التي يمكن استخدامها عمليا أي فئة الوضع.وأنا أحسب أن المتخصصة يساوي (مع كائن من الدرجة الفعلية كما المعلمة) هناك حاجة إلى الأداء.لتجنب رمز الازدواج العامة يساوي يجب أن ندعو المتخصصة يساوي.Null الشيكات يجب أن يؤديها مرة واحدة فقط ، حتى في الطبقات الموروثة.

وأخيرا جاء مع هذا التصميم:


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