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
nullvarsayı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)