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

В чем различие между классом и структурой в C#?

1.0 Junior🔥 161 комментариев
#C# и ООП#Управление памятью

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

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

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

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

Это фундаментальный вопрос, который часто путают даже опытные разработчики. Различия глубокие и влияют на производительность, особенно в контексте Unity.

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

Тип данных

  • Класс — reference type (ссылочный тип), хранится в heap
  • Структура — value type (тип значения), хранится в stack

Это самое важное различие и источник всех остальных различий.

Семантика копирования

public class PlayerClass {
    public int health = 100;
}

public struct PlayerStruct {
    public int health = 100;
}

// Работа с классом
var player1 = new PlayerClass();
var player2 = player1;  // Копируется ссылка
player2.health = 50;
Debug.Log(player1.health);  // 50 — оба указывают на один объект

// Работа со структурой
var p1 = new PlayerStruct();
var p2 = p1;  // Копируется значение
p2.health = 50;
Debug.Log(p1.health);  // 100 — разные копии

Для Unity это критично: если передаёшь структуру в функцию, она копируется. Если передаёшь класс — только ссылка.

Жизненный цикл

Класс:

  • Создаётся оператором new в heap
  • Требует garbage collection
  • Может быть null

Структура:

  • Создаётся на stack (обычно)
  • Автоматически удаляется из памяти
  • Не может быть null (unless nullable struct: Vector3?)

Производительность в контексте Unity

Здесь важный момент для game development:

// ❌ Плохо для performance — много копий на stack
public void ProcessPositions(Vector3 pos) {
    // Vector3 — это struct, копируется при передаче
}

// ✅ Лучше использовать ref для больших структур
public void ProcessPositions(ref Vector3 pos) {
    // Передаём ссылку на оригинал, без копирования
}

Наследование

  • Классы — поддерживают наследование, интерфейсы
  • Структуры — только интерфейсы, не могут наследовать классы

Когда использовать?

Используй класс для:

  • Сложных объектов (GameObject, Component, Entity)
  • Когда нужно наследование
  • Когда нужно передавать по ссылке
  • Когда нужна polymorphism

Используй структуру для:

  • Простых data containers (Vector3, Color, Quaternion)
  • Когда нужна value semantics
  • Когда критична производительность (часто создаются/удаляются)
  • Immutable данных

Практический пример

// ✅ Правильно — struct для данных
public struct DamageData {
    public int amount;
    public DamageType type;
}

// ✅ Правильно — класс для поведения
public class Weapon : MonoBehaviour {
    private DamageData damage;
    
    public void Deal(ref DamageData dmg) {
        // Используем ref, чтобы не копировать
    }
}

В Unity особенно важно помнить: Vector3, Quaternion, Color — это структуры. При частых операциях (Update тысячи раз) копирование может влиять на производительность. Поэтому используй ref где возможно.

В чем различие между классом и структурой в C#? | PrepBro