Ответ
Тип struct в C# является значимым типом (value type).
Ключевые отличия от ссылочных типов (class):
- Место хранения: Экземпляры
structобычно размещаются в стеке (stack) или внутри других объектов, если являются их полями. Экземплярыclassразмещаются в управляемой куче (heap). - Копирование: При присваивании или передаче
structв метод копируется всё его значение (по умолчанию). Дляclassкопируется только ссылка на объект в куче. - Наследование:
structне может наследовать от другогоstructилиclass(кроме неявного наследования отSystem.ValueType). Не может быть базовым типом. - Значение по умолчанию: Для
structэто экземпляр, где все поля инициализированы своими значениями по умолчанию (например, 0 дляint). Дляclass—null.
Пример, демонстрирующий семантику копирования:
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). Это может повысить производительность за счет уменьшения нагрузки на сборщик мусора и лучшей локализации данных.