Ответ
Нет, структура (struct) не всегда хранится в стеке. Будучи типом значения (value type), её расположение в памяти зависит от контекста.
Где может находиться struct:
- В стеке: Как локальная переменная внутри метода, если она не захвачена замыканием.
- В куче (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 будет в стеке для управления временем жизни или производительности. Ключевое свойство структур — семантика копирования по значению, а не место хранения.