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 болот (эч кандай өзгөртүү болбойт, анткени копия өзгөрдү)