Sobes.tech
Junior

Koja je razlika između klasa i struktura u C#?

sobes.tech АИ

Одговор од АИ

Класеови типови су референтни типови, структуре су вредносни типови.

  • Распоред у меморији: Екземпляри класа се распоређују у управљачки хип (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 (јер је промењена само копија)