Интерфейс IEquatable

IEquatable относиться к обобщенные интерфейсы. Этот интерфейс указываются по аналогии обобщенным классам.

Иногда нам необходимо сравнивать два экземпляра типа, допустим у нас есть класс Car с одинаковыми параметрами, цвета и марки автомобиля. Как в таком случаи найти 2 аналогичный автомобиля из списка? Для решения данной задачи могли бы просто переопределить Equals или оператор ==. Но это привело бы к замедлению работы программы, из за излишней упаковки значимых типов.

Для этих целей был придуман новый интерфейс IEquatable, позволяющий сравнить два значения без приведения типов и их проверки не прибегая к упаковке.

Пример 1. С реализацией IEquatable

using System;
using System.Drawing;

namespace ConsoleApp13
{
    class Program
    {
        class Car:IEquatable<Car>
        {
            readonly string name;
            readonly Color color;

            public Car(string name, Color color)
            {
                this.name = name;
                this.color = color;
            }

            public bool Equals(Car other)
            {
                if (this.color.Equals(other.color) && this.name.Equals(other.name))
                    return true;

                return false;
            }
        }
        static void Main(string[] args)
        {
            Car carOne = new Car("BMW",Color.Black);
            Car carTwo = new Car("BMW", Color.Black);

            Console.WriteLine(carOne.Equals(carTwo));
           
            Console.ReadKey();
        }
    }
}

 

Пример 2 без реализации интерфейса

using System;
using System.Drawing;

namespace ConsoleApp13
{
    class Program
    {
        class Car
        {
            readonly string name;
            readonly Color color;

            public Car(string name, Color color)
            {
                this.name = name;
                this.color = color;
            }

            public override bool Equals(object obj)
            {
                Car car = obj as Car;
                if (car != null)
                {
                    if (this.color.Equals(car.color) && this.name.Equals(car.name))
                        return true;
                }
                return false;
            }
        
        }
        static void Main(string[] args)
        {
            Car carOne = new Car("BMW",Color.Black);
            Car carTwo = new Car("BMW", Color.Black);

            Console.WriteLine(carOne.Equals(carTwo));
           
            Console.ReadKey();
        }
    }
}

 

Таким образом с появлением обобщенных классов, появились и другие методы сравнения типов с помощью интерфейса IEquatable, позволяющий ускорить работу программы при сравнении, не прибегая к упаковки, распаковке.

Обновлено: 07.04.2020 — 10:07

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.