Value и reference типы в языке C#
Значимые и ссылочные типы являются по праву одними из базисов языка C#, а вопрос об их отличиях, как следствие, одним из самых избитых на собеседованиях, поэтому сегодня я постараюсь ответить на него со всеми подробностями:
Значимые типы:
🔸 Унаследованы от System.ValueType (которые, в свою очередь, от System.Object)
🔸 Переменная хранит непосредственно значение, а в случае присваивания его копию
🔸 В качестве аргументов передаются по значению (копируются)
🔸 Не очищаются сборщиком мусора, не имеют деструктор и финализатор
🔸 Объявляются как структура (struct) или перечисление (enum)
🔸 Объявлены с модификатором sealed, а значит не могут выступать базовыми типами для наследников
Ссылочные типы:
🔸 Унаследованы от System.Object или иного ссылочного типа
🔸 Память под экземпляры выделяется в управляемой куче (managed heap)
🔸 Переменная хранит адрес (указатель) на участок памяти в управляемой куче, где уже хранится непосредственно значение (или null)
🔸 В качестве аргументов передаются по ссылке (указатель)
🔸 Очищаются сборщиком мусора
🔸 Объявляются как класс (class), делегат (delegate) или интерфейс (interface)
🔸 Поддерживают наследование
Одной из лучших и наиболее ёмких, на мой взгляд, статей по этой теме является Memory in .NET - what goes where от Jon Skeet'а.
💬 Я намеренно не стал приводить информацию о том, что значимые типы хранятся в стеке (потока выполнения). Дело в том, что это не совсем так. Подробнее про детали реализации value type и механизм выделения памяти для значений можно почитать в статье Eric Lipert'а: The Truth About Value Types.
✅ Понравилась заметка? Так поделись и с другими 😉
#data_types
Post #35
1.57K