В чем разница класса и структуры в C# и когда использовать структуру
Что проверяют
Понимаете ли семантику значения против ссылки и умеете ли назвать критерии выбора, а не просто список отличий. Классический подвох здесь про стек и кучу: заученную формулировку интервьюер ждёт, чтобы её оспорить.
Как отвечать
Класс это ссылочный тип: переменная хранит ссылку, присваивание копирует ссылку, сравнение по умолчанию идёт по ссылке, доступно наследование, значением по умолчанию может быть null. Структура это тип-значение: присваивание копирует всё содержимое, наследования нет, только реализация интерфейсов, значение по умолчанию это экземпляр с обнулёнными полями, а null невозможен без Nullable.
Где физически лежит структура, зависит от места объявления, а не от того, что это структура: локальная переменная в стеке, поле класса внутри объекта в куче, элемент массива в куче, захваченная лямбдой или асинхронным методом переменная тоже уезжает в кучу.
Структуру стоит брать, когда сходится всё сразу: тип маленький, ориентир до шестнадцати байт; логически это одно значение, вроде точки, денежной суммы или идентификатора; он неизменяемый; его не приводят постоянно к интерфейсу. Такой тип разумно объявлять как readonly struct, тогда компилятор не делает защитных копий при вызовах.
Где спотыкаются
Отвечают заученным «структуры в стеке, классы в куче». Поле-структура внутри объекта живёт в куче вместе с этим объектом, и на этом уточнении разговор обычно и заканчивается.
Делают изменяемые структуры. Индексатор списка возвращает копию, и запись в её поле не доходит до самого списка; поле, помеченное только для чтения, тоже копируется при каждом вызове метода. Ошибка тихая, компилятор ничего не скажет.
Забывают про упаковку. Приведение структуры к интерфейсу или к object создаёт объект в куче, и вся экономия на выделениях исчезает. Рядом стоит равенство: у структур оно по значению, но реализация по умолчанию работает медленно, поэтому в горячем коде переопределяют Equals и GetHashCode либо берут record struct.