В чем разница класса и структуры в C# и когда использовать структуру
Что проверяют
Понимаете ли вы разницу семантики и знаете ли, что структура не всегда на стеке.
Как отвечать
Класс это ссылочный тип: переменная содержит ссылку, копируется ссылка, экземпляры живут в куче. Структура это значимый тип: копируется всё содержимое, и при присваивании получаются два независимых значения.
struct P { public int X; }
var a = new P(); var b = a; b.X = 5; // a.X остался 0Частая неточность: «структуры на стеке». На стеке лежит локальная переменная значимого типа, но структура, ставшая полем класса или элементом массива, живёт в куче вместе с владельцем.
Другие отличия: у структуры нет наследования (только реализация интерфейсов), нет null без Nullable<T>, всегда есть конструктор по умолчанию, обнуляющий поля; равенство по значению, а не по ссылке.
Когда брать структуру: тип маленький (ориентир до 16 байт), логически это одно значение (точка, деньги, диапазон), он неизменяемый и живёт недолго. Хороший пример из библиотеки это DateTime, Guid, TimeSpan.
Когда не брать: тип большой (копирование дороже работы со ссылкой), изменяемый (изменяемые структуры дают ошибки, потому что меняется копия) или требует наследования.
Отдельно про упаковку: приведение структуры к object или к интерфейсу создаёт объект в куче. В горячем коде это заметно, и для таких случаев есть readonly struct и ref struct.
Где спотыкаются
Говорят «структуры всегда на стеке».
Делают изменяемые структуры и удивляются, что изменение не сохранилось.
Не знают про упаковку и её стоимость.
Берут структуру ради производительности, не замерив: копирование крупного значения обычно дороже разыменования ссылки.