Становится ли структура (struct) ссылочным типом при использовании ref или out в C#?

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

Ответ

Нет, не становится. Структура остаётся типом значения (value type). Ключевые слова ref и out позволяют передавать её по ссылке, избегая копирования, но это не превращает саму структуру в ссылочный тип (reference type). Упаковки (boxing) не происходит, и данные по-прежнему хранятся в стеке (или внутри родительского объекта), а не в управляемой куче.

Практическая разница:

  • Без ref/out: В метод передаётся копия структуры. Изменения внутри метода не затрагивают оригинал.
  • С ref/out: В метод передаётся ссылка на исходную структуру. Изменения применяются непосредственно к ней.

Пример:

public struct Point { public int X; public int Y; }

// Метод с ref изменяет оригинальную структуру
void ModifyPoint(ref Point p) => p.X = 99;

Point point = new Point { X = 1, Y = 2 };
ModifyPoint(ref point); // Передаём по ссылке
Console.WriteLine(point.X); // Выведет: 99 (оригинал изменён)

Итог: ref/out для структур — это оптимизация (избегание копирования больших данных) и способ модификации оригинала, а не изменение природы типа.