День восемьсот сорок девятый. #ЗаметкиНаПолях
Стек или Куча
Тема про сборщик мусора и паттерн Disposable пару дней назад вызвала бурную дискуссию у нас в чате. Сегодня предложу вам не менее острую: ссылочные типы и типы значений, и где они хранятся. Короткий (и неправильный) ответ: ссылочные - в куче, а типы значений - в стеке.
Типы значений в .NET – это bool, byte, sbyte, char, decimal, double, float, int, uint, nint, nuint, long, ulong, short, ushort, struct, enum и кортежи. Все остальные типы ссылочные.
На самом деле, всё немного сложнее. Типы значений могут храниться в куче в некоторых случаях. Вот краткий список правил хранения экземпляров типа значения:
1. переменная в методе – в стеке,
2. параметр метода – в стеке,
3. поле класса – в куче,
4. элемент коллекции – в куче,
5. поле структуры – там, где хранится структура,
6. тип ref struct и его члены – всегда в стеке.
Подробнее в новом видео от Nick Chapsas по ссылке ниже. Кроме того, Ник наглядно показывает, где хранится переменная в том или ином случае, а также, что такое упаковка, и почему она происходит при интерполяции строк.
Источник: https://www.youtube.com/watch?v=jONSIhMST9E
Post #1038
1.38K