Полезные ссылки:
- [[Оператор ==, Equals(), GetHashCode()]]
![[Pasted image 20240205135456.png]]
Участок кода, где происходил аллокация в куче:
```csharp
var ctfn = new Ctfn(componentType, fieldName);
if (!_i.SovkaData._buffer.TryGetValue(ctfn, out var hashSet))
```
Аллокация памяти в куче происходила из-за того, что я использую значимый тип (структуру, кортеж) в качестве ключа для `Dictionary`.
Проблема в том, что происходит `boxing (упаковка)` в ссылочный тип.
Так происходит, потому что к Equals параметром является `object`, что приводит к `boxing`.
```csharp
public override bool Equals(object obj)
```
### Решение 1
Использовать [[IEquatable<T>]].
[[IEquatable<T>#Пример использования|Пример использования]]
### Решение 2
Использовать [[EqualityComparer<T>]]