Все самое полезное для C#-разработчика в одном канале.
Наши курсы: https://clc.to/y3LDtw
По рекламе: @tproger_sales_bot
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Post #6716
3.96K
⚡️ Урок про боксинг в C#
Разбираем типичную ошибку, которая встречается даже в коде крупных проектов.
Код с подвохом:
На первый взгляд всё логично: сначала быстрая проверка через ReferenceEquals, если не сработала — сравниваем по полям.
В чём подвох
Что происходит при вызове
• this упаковывается в новый объект
• Создаётся уникальная ссылка в heap
• Сравниваются две разные ссылки
• Результат всегда false
В современных версиях .NET есть правило CA2013, которое отлавливает подобные случаи.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминатор
Разбираем типичную ошибку, которая встречается даже в коде крупных проектов.
Код с подвохом:
struct StackValue
{
public override bool Equals(object obj)
{
if (Object.ReferenceEquals(this, obj))
return true;
if (!(obj is StackValue))
return false;
var value = (StackValue)obj;
return this.Kind == value.Kind
&& this.Flags == value.Flags
&& this.Type == value.Type;
}
}
На первый взгляд всё логично: сначала быстрая проверка через ReferenceEquals, если не сработала — сравниваем по полям.
В чём подвох
ReferenceEquals принимает параметры типа object. Когда вы передаёте структуру, происходит боксинг: значение копируется в хип и оборачивается объектом.Что происходит при вызове
Equals:• this упаковывается в новый объект
• Создаётся уникальная ссылка в heap
• Сравниваются две разные ссылки
• Результат всегда false
В современных версиях .NET есть правило CA2013, которое отлавливает подобные случаи.
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминатор
- 👍 21
- 🥱 3
- ❤ 1










