← Все вопросы

Когда использовать struct вместо class в C#?

Задан 2 месяца назад296 просмотров2 ответа
10

Понял, что в C# есть и class, и struct, и синтаксис у них почти одинаковый. Но в чём практическая разница и в каких случаях лучше брать структуру?

struct Point { public int X; public int Y; }
class Person { public string Name; }

2 ответа

16
✓ Принятый ответ — помог автору

Ключевое различие: 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 не поддерживает наследование (нельзя унаследоваться от другой структуры), но может реализовывать интерфейсы.

7

Подводный камень со структурами — изменяемые (mutable) struct ведут себя неинтуитивно:

struct Counter { public int Value; public void Inc() => Value++; }

List<Counter> list = new() { new Counter() };
list[0].Inc(); // не скомпилируется или изменит копию, а не элемент списка

Поэтому официальная рекомендация Microsoft: делайте структуры неизменяемыми (поля только для чтения). А по умолчанию для сущностей предметной области используйте class.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект