← Назад к вопросам
В чем различие между классом и структурой в 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 где возможно.