На какие категории делятся типы данных в C#
Что проверяют
Знаете ли вы, что деление в C# проходит по одной главной границе: типы значений против ссылочных типов. Вопрос стартовый, но по ответу сразу понятно, путаете ли вы категорию типа с местом его хранения.
Как отвечать
Назовите разделение так, как оно устроено в языке:
- типы значений: переменная хранит само значение. Сюда входят простые типы (
int,double,bool,char,decimal), структуры, перечисления, кортежи-значения и nullable-варианты вродеint?; - ссылочные типы: переменная хранит ссылку на объект. Это классы, интерфейсы, массивы, делегаты,
string,object,dynamic; - указатели, доступные только в блоке
unsafe. Про них достаточно одной фразы, чтобы показать, что картина полная.
Дальше важна практика, а не список. При присваивании значение копируется целиком, ссылка копирует только адрес, и два имени начинают указывать на один объект. Сравнение по умолчанию тоже разное: у структур поэлементное, у классов по ссылке, пока не переопределён Equals. Значение по умолчанию у ссылочного типа null, у структуры это экземпляр с обнулёнными полями.
Хорошо добавить, что string ссылочный тип, но ведёт себя почти как значение из-за неизменяемости, а object корень иерархии, поэтому тип значения можно упаковать в него и получить объект в куче.
Где спотыкаются
Говорят «типы значений лежат в стеке, ссылочные в куче». Поле типа значения внутри класса живёт в куче вместе с объектом, а переменная, захваченная замыканием или итератором, уезжает в сгенерированный класс. Место хранения это деталь реализации, категория же задаёт семантику копирования.
Выносят структуры и перечисления в отдельные категории наравне с типами значений. Это и есть типы значений, просто разные их виды. Та же ошибка с коллекциями: List<TItem> обычный класс, отдельной категорией он не является.
Не помнят про упаковку. Присваивание int в переменную типа object создаёт объект в куче и копию значения, поэтому изменение исходной переменной на упакованную копию не влияет, а в горячем цикле такие упаковки заметно нагружают сборщик мусора.