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 (јер је промењена само копија)