Sobes.tech
Junior
111
questionbank

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

Answer from AI

sobes.tech AI

Классы - ссылочные типы, структуры - значимые типы.

  • Размещение в памяти: Экземпляры классов размещаются в управляемой куче (Heap), экземпляры структур - в стеке (Stack) или внутри объекта, которому принадлежат.
  • Наследование: Классы поддерживают наследование, структуры - нет. Структуры могут реализовывать интерфейсы.
  • Значение по умолчанию: Для классов null является значением по умолчанию. Для структур - набор нулей для полей.
  • Передача в методы: Экземпляры классов передаются по ссылке (передается ссылка на объект). Экземпляры структур передаются по значению (создается копия).
  • Производительность: Структуры могут быть быстрее классов для небольших объектов, так как избегаются издержки на управление кучей и сборку мусора. Однако передача больших структур по значению может быть менее эффективной.
  • Создание: Для структур неявный конструктор без параметров инициализирует поля нулями. Для классов требуется явный конструктор без параметров, если определены другие конструкторы.
Признак Класс (Class) Структура (Struct)
Тип Ссылочный Значимый
Размещение Управляемая куча Стек / Встроенный
Наследование Поддерживает Не поддерживает (но реализует интерфейсы)
Значение по умолч. null Набор нулей
Передача По ссылке По значению
Производительность Могут быть медленнее для малых объектов Могут быть быстрее для малых объектов
Неявный констр. Нет (если есть другие) Да (инициализация нулями)
// Пример класса
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

    public PointClass(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// Пример структуры
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

    public PointStruct(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// Демонстрация передачи
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // Изменит исходный PointClass
    ps.X = 100; // Изменит только копию PointStruct
}

// Использование
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X будет 100
// pointStruct1.X будет 1 (т.к. изменилась только копия)