← Назад к вопросам
В чем разница между классом и структурой?
1.3 Junior🔥 281 комментариев
#ООП и паттерны проектирования#Основы C# и .NET
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между классом и структурой в C#
Хотя классы и структуры похожи синтаксически, они имеют принципиальные различия в том, как работают с памятью и поведением.
Основные различия
| Аспект | Класс | Структура |
|---|---|---|
| Тип данных | Ссылочный тип (reference type) | Тип значения (value type) |
| Хранение | Heap (куча) | Stack (стек) или встроенная память |
| Наследование | Поддерживает | Только от interfaces |
| Конструктор | Может быть без параметров | Требуется инициализация всех полей |
| Default значение | null | Default values полей |
| Производительность | Медленнее (GC overhead) | Быстрее (нет GC) |
Примеры
Класс:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
var p1 = new Person { Name = "Alice", Age = 30 };
var p2 = p1;
p2.Name = "Bob";
Console.WriteLine(p1.Name); // "Bob" — изменение через p2 повлияло на p1
Структура:
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
}
var point1 = new Point { X = 10, Y = 20 };
var point2 = point1;
point2.X = 30;
Console.WriteLine(point1.X); // 10 — point1 не изменилась
Когда использовать структуры
- Малые объекты: координаты, цены, даты
- Неизменяемость: DateTime, TimeSpan, Guid
- Высокая производительность: критичны скорость и память
- Не требуется наследование
Когда использовать классы
- Большие объекты: сущности, бизнес-объекты
- Полиморфизм: нужно наследование и интерфейсы
- Мутабельность: объекты часто изменяются
- Reference semantics: нужна семантика ссылок
Практические примеры
// Структура — хорошо
public struct Price
{
public decimal Amount { get; }
public string Currency { get; }
}
// Класс — хорошо
public class Order
{
public int Id { get; set; }
public List<OrderItem> Items { get; set; }
public DateTime CreatedAt { get; set; }
}
Важный момент: Boxing/Unboxing
Когда структура присваивается переменной типа object или interface, происходит Boxing:
int value = 42; // структура
object boxed = value; // boxing — копия в heap
int unboxed = (int)boxed; // unboxing
Это может снизить производительность, поэтому нужно избегать частого Boxing структур.