Sobes.tech
Junior

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

sobes.tech AI

Отговор от 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 (тъй като е променено само копието)