Всегда ли структура (struct) хранится в стеке в C#?

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

Ответ

Нет, структура (struct) не всегда хранится в стеке. Будучи типом значения (value type), её расположение в памяти зависит от контекста.

Где может находиться struct:

  1. В стеке: Как локальная переменная внутри метода, если она не захвачена замыканием.
  2. В куче (heap): Когда она является:
    • Поле класса.
    • Элементом массива.
    • Упакована (boxed) в object или интерфейсный тип.
    • Захвачена замыканием (лямбда-выражением).

Пример, демонстрирующий разные случаи:

struct Point { public int X, Y; }

class MyClass
{
    private Point _fieldPoint; // Хранится в куче (в составе объекта MyClass)
}

void Example()
{
    Point localPoint; // Хранится в стеке
    localPoint.X = 5;

    Point[] pointArray = new Point[10]; // Массив структур хранится в куче
    pointArray[0] = localPoint;

    object boxedPoint = localPoint; // Упаковка (boxing) - копия структуры помещается в кучу
}

Практический вывод: Нельзя полагаться на то, что struct будет в стеке для управления временем жизни или производительности. Ключевое свойство структур — семантика копирования по значению, а не место хранения.