Sobes.tech
Junior

C#'ta sınıflar ve yapılar arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Sınıflar referans tipleri, yapılar ise değer tipleridir.

  • Bellek konumu: Sınıf örnekleri yönetilen yığında (Heap), yapılar ise yığında (Stack) veya ait oldukları nesne içinde yer alır.
  • Miras: Sınıflar miras alabilir, yapılar hayır. Yapılar arayüzleri uygulayabilir.
  • Varsayılan değer: Sınıflar için null varsayılan değerdir. Yapılar için alanlar için sıfırların kümesi.
  • Yöntemlere iletim: Sınıf örnekleri referansla iletilir (nesneye referans iletilir). Yapılar ise değerle iletilir (kopyası oluşturulur).
  • Performans: Yapılar, küçük nesneler için sınıflardan daha hızlı olabilir, çünkü yığın yönetimi ve çöp toplamı maliyetlerinden kaçınılır. Ancak, büyük yapıları değerle iletmek daha az verimli olabilir.
  • Oluşturma: Yapılar için, varsayılan yapıcı alanları sıfır olarak başlatır. Sınıflar için, başka yapıcılar tanımlandıysa, açık bir varsayılan yapıcı gereklidir.
Özellik Sınıf (Class) Yapı (Struct)
Tip Referans tipi Değer tipi
Bellek konumu Yönetilen yığın Yığın / Dahili
Miras Destekler Desteklemez (ancak arayüzleri uygular)
Varsayılan değer null Sıfırların kümesi
Geçiş Referansla Değerle
Performans Küçük nesneler için daha yavaş olabilir Küçük nesneler için daha hızlı olabilir
Varsayılan yapıcı Yok (başka varsa) Evet (sıfırla başlatır)
// Sınıf örneği
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Yapı örneği
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Geçiş gösterimi
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // Orijinal PointClass'i değiştirecek
    ps.X = 100; // Sadece kopya PointStruct'i değiştirecek
}

// Kullanım
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X 100 olacak
// pointStruct1.X 1 olacak (sadece kopya değiştirildiği için)