Sobes.tech
Junior

C#-də siniflər və strukturlar arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Sınıflar referans tipləridir, strukturlar isə dəyər tipləridir.

  • Yaddaşda yerləşmə: Sınıf nümunələri idarə olunan yığında (Heap), strukturlar yığında (Stack) və ya aid olduqları obyektin içində yerləşir.
  • İrsi: Sınıflar irsi dəstəkləyir, strukturlar dəstəkləmir. Strukturlar interfeysləri həyata keçirə bilər.
  • Əsas dəyər: Sınıflar üçün null əsas dəyərdir. Strukturlar üçün sahələr üçün sıfırların toplusudur.
  • Metodlara ötürülmə: Sınıf nümunələri referansla (obyektə referans ötürülür). Strukturlar dəyər ilə (kopya yaradılır) ötürülür.
  • Performans: Kiçik obyektlər üçün strukturlar sınıflardan daha sürətli ola bilər, çünki yığın idarəetmə və tullantı toplanması xərclərindən qaçınır. Ancaq, böyük strukturların dəyər ilə ötürülməsi daha az effektiv ola bilər.
  • Yaradıcılıq: Strukturlar üçün, qeyri-parametrli konstruktor sahələri sıfırla başlatır. Sınıflar üçün, digər konstruktorlar təyin olunubsa, açıq parametrsiz konstruktor tələb olunur.
Xüsusiyyət Sinif (Class) Struktur (Struct)
Növ Referans növü Dəyər növü
Yaddaşda yerləşmə İdarə olunan yığın Yığın / Daxili
İrsiyyət Dəstəkləyir Dəstəkləmir (amma interfeysləri həyata keçirir)
Əsas dəyər null Sıfırların toplusu
Keçirmə Referansla Dəyər ilə
Performans Kiçik obyektlər üçün daha yavaş ola bilər Kiçik obyektlər üçün daha sürətli ola bilər
Qeyri-parametrli konstruktor Yox (əgər başqa mövcuddursa) Bəli (sıfırla başlatma)
// Nümunə sinif
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

    public PointClass(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// Nümunə struktur
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

    public PointStruct(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// Keçirmə nümayişi
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // Orijinal PointClass dəyişəcək
    ps.X = 100; // Yalnız nüsxə PointStruct dəyişəcək
}

// İstifadə
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X 100 olacaq
// pointStruct1.X 1 olacaq (yalnız nüsxə dəyişdirildiği üçün)