ما الفرق بين واجهات غير صادقة وغير قابلة للتطبيق؟

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

سؤال

يبدو أن الواجهات تقارن كائنات المساواة، فما هي الاختلافات الرئيسية بينهما؟

هل كانت مفيدة؟

المحلول

IEquatable اختبارات ما إذا كانت كائنين متساوية.

IComparable يفرض الطلب الكلي على الكائنات التي تتم مقارنتها.

علي سبيل المثال، IEquatable سيخبرك أن 5 لا يساوي 7. IComparable سيخبرك أن 5 يأتي قبل 7.

نصائح أخرى

IEquatable<T> للمساواة.

IComparable<T> للطلب.

بالإضافة إلى إجابة greg d's:

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

كما ذكر على صفحة MSDN للحصول على Iequatable:

واجهة المعرفة تحدد CompareTo الطريقة، التي تحدد ترتيب الفرز من مثيلات نوع التنفيذ. واجهة Iequatable تحدد Equals الطريقة، التي تحدد مساواة حالات نوع التنفيذ.

Equals ضد. CompareTo

IComparable <T> يحدد طريقة مقارنة نوع معين يمكن استخدامها لطلب أو فرز الكائنات.

IEquatable <T> يعرف الطريقة المعممة التي يمكن استخدامها لتنفيذها لتحديد المساواة.


دعنا نقول أن لديك شخصية شخص

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Person p1 = new Person() { Name = "Person 1", Age = 34 };
Person p2 = new Person() { Name = "Person 2", Age = 31 };
Person p3 = new Person() { Name = "Person 3", Age = 33 };
Person p4 = new Person() { Name = "Person 4", Age = 26 };

List<Person> people = new List<Person> { p1, p2, p3, p4 };

لفرز هذه الكائنات التي يمكنك استخدامها people.Sort();.

ولكن هذا سوف ألقيت استثناء.

enter image description here

الإطار لا يعرف كيفية فرز هذه الكائنات. تحتاج إلى معرفة كيفية فرز التنفيذ IComparable واجهه المستخدم.

public class Person : IComparable
{
    public string Name { get; set; }
    public int Age { get; set; }

    public int CompareTo(object obj)
    {
        Person otherPerson = obj as Person;
        if (otherPerson == null)
        {
            throw new ArgumentNullException();
        }
        else
        {
            return Age.CompareTo(otherPerson.Age);
        }
    }
}

هذا سوف فرز الصفيف بشكل صحيح مع Sort() طريقة.


التالي لمقارنة كائنين يمكنك استخدامه Equals() طريقة.

var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);

هذا سيعود false لأن Equals الطريقة لا تعرف كيفية مقارنة كائنين. لذلك تحتاج إلى تنفيذ IEquatable واجهة وأخبر الإطار كيفية القيام بالمقارنة. التمديد على المثال السابق سوف تبدو مثل هذا.

public class Person : IComparable, IEquatable<Person>
{
    //Some code hidden

    public bool Equals(Person other)
    {
        if (Age == other.Age && Name == other.Name)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top