Когда использовать struct вместо class в C#?
Понял, что в C# есть и class, и struct, и синтаксис у них почти одинаковый. Но в чём практическая разница и в каких случаях лучше брать структуру?
struct Point { public int X; public int Y; }
class Person { public string Name; }
2 ответа
Ключевое различие: struct — значимый тип (value type), class — ссылочный тип (reference type). От этого зависит поведение при присваивании и передаче в методы.
struct PointS { public int X; }
class PointC { public int X; }
var a = new PointS { X = 1 };
var b = a; // КОПИЯ
b.X = 99;
Console.WriteLine(a.X); // 1 — оригинал не изменился
var c = new PointC { X = 1 };
var d = c; // та же ссылка
d.X = 99;
Console.WriteLine(c.X); // 99 — изменился, это один объект
Структуры обычно живут в стеке (или внутри объекта), не требуют выделения в куче и сборки мусора. Поэтому они хороши для маленьких неизменяемых данных.
Берите struct, когда:
- тип маленький (примерно до 16 байт),
- логически это одно значение (точка, цвет, координата, денежная сумма),
- он неизменяемый (immutable),
- его не нужно часто упаковывать в object.
Берите class в остальных случаях — это выбор по умолчанию для большинства сущностей (Person, Order, Service). Если сомневаетесь — берите class.
Ещё нюанс: struct не поддерживает наследование (нельзя унаследоваться от другой структуры), но может реализовывать интерфейсы.
Подводный камень со структурами — изменяемые (mutable) struct ведут себя неинтуитивно:
struct Counter { public int Value; public void Inc() => Value++; }
List<Counter> list = new() { new Counter() };
list[0].Inc(); // не скомпилируется или изменит копию, а не элемент списка
Поэтому официальная рекомендация Microsoft: делайте структуры неизменяемыми (поля только для чтения). А по умолчанию для сущностей предметной области используйте class.