IEquatable относиться к обобщенные интерфейсы. Этот интерфейс указываются по аналогии обобщенным классам.
Иногда нам необходимо сравнивать два экземпляра типа, допустим у нас есть класс Car с одинаковыми параметрами, цвета и марки автомобиля. Как в таком случаи найти 2 аналогичный автомобиля из списка? Для решения данной задачи могли бы просто переопределить Equals или оператор ==. Но это привело бы к замедлению работы программы, из за излишней упаковки значимых типов.
Для этих целей был придуман новый интерфейс IEquatable, позволяющий сравнить два значения без приведения типов и их проверки не прибегая к упаковке.
Пример 1. С реализацией IEquatable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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 без реализации интерфейса
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
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, позволяющий ускорить работу программы при сравнении, не прибегая к упаковки, распаковке.