← Назад к вопросам

В чем разница между классом и структурой?

1.3 Junior🔥 281 комментариев
#ООП и паттерны проектирования#Основы C# и .NET

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между классом и структурой в C#

Хотя классы и структуры похожи синтаксически, они имеют принципиальные различия в том, как работают с памятью и поведением.

Основные различия

АспектКлассСтруктура
Тип данныхСсылочный тип (reference type)Тип значения (value type)
ХранениеHeap (куча)Stack (стек) или встроенная память
НаследованиеПоддерживаетТолько от interfaces
КонструкторМожет быть без параметровТребуется инициализация всех полей
Default значениеnullDefault 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 структур.