Набір - це колекція унікальних значень. Типова реалізація набору в .NET - це HashSet<T>.
Клас HashSet використовує метод GetHashCode() кожного елемента.
Типово реалізація GetHashCode() для посилальних типів повертає хеш на основі розташування в памʼяті. Це означає, що різні обʼєкти посилального типу матимуть різні хеш-коди (це називають рівністю посилань). Типи-значення типово повертають хеш своїх полів/властивостей. Це означає, що різні обʼєкти типу-значення з однаковими значеннями полів/властивостей матимуть однаковий хеш-код (це називають структурною рівністю).
Ми можемо перевизначити реалізацію GetHashCode() у власних класах, щоб посилальний тип мав структурну рівність.