Обложка канала

C# 1001 notes

Регулярные короткие заметки по C# и .NET. Просто о сложном для каждого.

C# 1001 notes

8 лет назад
Открыть в
​​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