Что такое боксинг и анбоксинг в C#
Что проверяют
Различаете ли вы значимые и ссылочные типы на уровне памяти и понимаете ли цену неявной упаковки для сборщика мусора. Вопрос базовый, но по ответу видно, читали ли вы про кучу и стек что-то дальше учебника.
Как отвечать
Боксинг это упаковка значения значимого типа в объект на управляемой куче: создаётся объект с заголовком, туда копируется значение, а переменная типа object или интерфейса получает ссылку. Анбоксинг это обратное явное приведение с проверкой типа в среде выполнения и копированием значения назад.
int number = 42;
object boxed = number; // боксинг
int back = (int)boxed; // анбоксингСильный ответ это перечень мест, где упаковка происходит незаметно: присваивание в object, необобщённые коллекции вроде ArrayList, приведение структуры к реализуемому ею интерфейсу, вызов унаследованных Equals и GetHashCode, если структура их не переопределяет.
Цена: лишняя аллокация, давление на нулевое поколение и промахи по кэшу процессора в горячем цикле. Чем закрывать: обобщённые коллекции и методы, реализация IEquatable для своих структур, сравнение через EqualityComparer, работа со Span вместо промежуточных объектов.
Где спотыкаются
Говорят про упаковку, но упускают, что в кучу уходит копия. Потом удивляются, что изменение распакованной переменной не отражается на упакованном объекте, и ищут мистику вместо семантики копирования.
Уверены, что обобщения отменяют боксинг в принципе. Список целых действительно не упаковывает элементы, но структура, приведённая к интерфейсу, упакуется и внутри обобщённого кода.
Ждут от анбоксинга поведения обычного числового преобразования. Он требует точного совпадения типа: попытка достать длинное целое из упакованного короткого даёт InvalidCastException, хотя прямое присваивание таких типов компилируется без вопросов.