Тип struct в C# — это значимый или ссылочный тип?

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

Ответ

Тип struct в C# является значимым типом (value type).

Ключевые отличия от ссылочных типов (class):

  1. Место хранения: Экземпляры struct обычно размещаются в стеке (stack) или внутри других объектов, если являются их полями. Экземпляры class размещаются в управляемой куче (heap).
  2. Копирование: При присваивании или передаче struct в метод копируется всё его значение (по умолчанию). Для class копируется только ссылка на объект в куче.
  3. Наследование: struct не может наследовать от другого struct или class (кроме неявного наследования от System.ValueType). Не может быть базовым типом.
  4. Значение по умолчанию: Для struct это экземпляр, где все поля инициализированы своими значениями по умолчанию (например, 0 для int). Для classnull.

Пример, демонстрирующий семантику копирования:

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

Point p1 = new Point { X = 10, Y = 20 };
Point p2 = p1; // Происходит ПОЛНОЕ КОПИРОВАНИЕ значений полей X и Y

p2.X = 100; // Изменяется только копия
Console.WriteLine(p1.X); // Вывод: 10 (оригинал не изменился)
Console.WriteLine(p2.X); // Вывод: 100

Когда использовать struct: Для небольших, неизменяемых (или преимущественно неизменяемых) типов, которые логически представляют единое значение (например, Point, ComplexNumber, Money). Это может повысить производительность за счет уменьшения нагрузки на сборщик мусора и лучшей локализации данных.