Ответ
Короткий ответ: Локальные переменные хранятся в стеке потока (Thread Stack).
Детализация: При вызове метода для него выделяется область памяти в стеке — стековый фрейм. В этом фрейме размещаются:
- Параметры метода.
- Адрес возврата (куда передать управление после завершения метода).
- Локальные переменные этого метода.
Пример для значимых и ссылочных типов:
void Calculate()
{
int localInt = 42; // Само значение 42 хранится в стеке.
string localString = "Hi"; // В стеке хранится ССЫЛКА (указатель).
// Сам объект строки "Hi" находится в куче (heap).
}
Преимущества хранения в стеке:
- Высокая скорость: Выделение и освобождение памяти происходит путем простого перемещения указателя стека.
- Автоматическое управление памятью: При выходе из метода весь стековый фрейм «сворачивается», и память мгновенно освобождается.
Ограничения:
- Ограниченный размер: Стек обычно имеет небольшой фиксированный размер (например, 1 МБ). Хранение больших структур или глубокие рекурсивные вызовы могут привести к
StackOverflowException. - Время жизни: Локальные переменные недоступны после завершения работы метода.