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