Где хранятся локальные переменные в C#?

«Где хранятся локальные переменные в C#?» — вопрос из категории Управление памятью, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Короткий ответ: Локальные переменные хранятся в стеке потока (Thread Stack).

Детализация: При вызове метода для него выделяется область памяти в стеке — стековый фрейм. В этом фрейме размещаются:

  1. Параметры метода.
  2. Адрес возврата (куда передать управление после завершения метода).
  3. Локальные переменные этого метода.

Пример для значимых и ссылочных типов:

void Calculate()
{
    int localInt = 42;          // Само значение 42 хранится в стеке.
    string localString = "Hi"; // В стеке хранится ССЫЛКА (указатель).
                               // Сам объект строки "Hi" находится в куче (heap).
}

Преимущества хранения в стеке:

  • Высокая скорость: Выделение и освобождение памяти происходит путем простого перемещения указателя стека.
  • Автоматическое управление памятью: При выходе из метода весь стековый фрейм «сворачивается», и память мгновенно освобождается.

Ограничения:

  • Ограниченный размер: Стек обычно имеет небольшой фиксированный размер (например, 1 МБ). Хранение больших структур или глубокие рекурсивные вызовы могут привести к StackOverflowException.
  • Время жизни: Локальные переменные недоступны после завершения работы метода.