Sobes.tech
Junior
128
questionbank

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

Answer from AI

sobes.tech AI

  • Структура (struct) - это тип значения, хранящий свои данные напрямую в стеке (для локальных переменных) или в куче как часть объекта-владельца. Передача происходит по значению (копирование).
  • Класс (class) - это ссылочный тип, хранящий свои данные в куче. Переменная класса хранит только ссылку на объект. Передача происходит по ссылке (копирование ссылки).

Основные отличия:

Отличие Структура (struct) Класс (class)
Тип Значение Ссылка
Размещение Стек/часть объекта в куче Куча
Передача По значению (копирование данных) По ссылке (копирование ссылки)
Наследование Не поддерживает наследование от других структур или классов, но может реализовывать интерфейсы Поддерживает наследование от других классов и реализацию интерфейсов
Поля Поля экземпляра не могут быть инициализированы напрямую при объявлении Поля экземпляра могут быть инициализированы напрямую при объявлении
Конструктор Не может иметь конструктор без параметров, явно определенный пользователем. Автоматически создается конструктор без параметров Могут иметь конструкторы без параметров, явно определенные пользователем
Null Не может быть null, за исключением Nullable<T> Может быть null
Использование Для небольших, простых типов данных, когда важна производительность за счет уменьшения выделений памяти в куче Для более сложных объектов, когда требуется полиморфизм, наследование, или объект potentially large

Пример:

// Пример структуры (типа значения)
public struct PointStruct
{
    public int X;
    public int Y;

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

// Пример класса (ссылочного типа)
public class PointClass
{
    public int X;
    public int Y;

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

// Использование
PointStruct p1 = new PointStruct(1, 2);
PointStruct p2 = p1; // Копируется значение (1, 2)
p2.X = 10; // Изменяется только p2, p1 остается без изменений
// p1.X будет 1

PointClass pc1 = new PointClass(1, 2);
PointClass pc2 = pc1; // Копируется ссылка
pc2.X = 10; // Изменяется объект, на который ссылается pc1 и pc2
// pc1.X будет 10