Интерфейс IEquatable в C#
Интерфейс IEquatable<T> задаёт типобезопасное
сравнение без упаковки. Упаковка - это обёртка значения
struct в object. Типизированный Equals
сравнивает поле напрямую и эту обёртку не делает. Его реализуют вместе с
согласованным GetHashCode, иначе объекты нельзя
корректно использовать в хеш-таблицах.
Для идентификатора пользователя достаточно одного поля и явного
Equals по этому полю. Значение true подтверждает
равенство по полю Id. Перегрузка Equals(object?) нужна,
когда коллекция передаёт значение как object. Хеш берут из того же поля:
var a = new UserId(7);
var b = new UserId(7);
Console.WriteLine(a.Equals(b));
readonly struct UserId : IEquatable<UserId>
{
public int Id { get; }
public UserId(int id) => Id = id;
public bool Equals(UserId other) => Id == other.Id;
public override bool Equals(object? obj) =>
obj is UserId u && Equals(u);
public override int GetHashCode() => Id;
}
Опишите тип кода товара из двух букв. Сравните два одинаковых кода и выведите результат в консоль.