crazy_coder
Moderatör
- Katılım
- 20 Şub 2026
- Mesajlar
- 204
- Tepkime puanı
- 0
- Puanları
- 16
C# Struct vs Class: Bellek Yönetimi ve Performansın Perde Arkası
C#'ta veri yapılarını oluşturmak için iki seçeneğimiz vardır. Birincisi, referans tipi olan Class; ikincisi ise değer tipi olan Struct. Aralarındaki fark sadece bir anahtar kelime değil, verinin bellekte (RAM) nerede ve nasıl tutulduğudur.
1. Temel Fark: Stack vs Heap
C# belleği iki ana bölgeye ayırır. Bu iki yapının nerede yaşadığını bilmek, performansın anahtarıdır.
[]Class (Referans Tipi): Verinin kendisi Heap bölgesinde saklanır. Stack bölgesinde ise sadece o verinin adresini tutan bir "referans" (işaretçi) bulunur.
[]Struct (Değer Tipi): Verinin kendisi doğrudan Stack bölgesinde saklanır. Karmaşık nesne yönetim süreçlerine (pointer takibi gibi) ihtiyaç duymaz.
2. Davranış Farkı: Kopyalama mı, Referans mı?
Bir nesneyi başka bir nesneye eşitlediğinizde ne olduğuna bakalım:
Struct'larda kopyalama:
Bir struct'ı diğerine atadığınızda, içindeki tüm veriler yeni bir kutuya kopyalanır. Birindeki değişiklik diğerini etkilemez.
C#:
public struct Nokta { public int X; }
Nokta n1 = new Nokta { X = 10 };
Nokta n2 = n1; // Veri kopyalandı
n2.X = 20;
Console.WriteLine(n1.X); // Çıktı: 10
Class'larda referans:
Bir class'ı diğerine eşitlediğinizde sadece adres kopyalanır. İki değişken de bellekteki aynı veriyi gösterir.
C#:
public class Koordinat { public int X; }
Koordinat k1 = new Koordinat { X = 10 };
Koordinat k2 = k1; // Adres kopyalandı
k2.X = 20;
Console.WriteLine(k1.X); // Çıktı: 20
3. Teknik ve Yapısal Farklar
| Özellik | Struct | Class |
|---|---|---|
| Tip | Değer Tipi (Value Type) | Referans Tipi (Reference Type) |
| Bellek | Stack | Heap |
| Kalıtım | Kalıtımı desteklemez. | Kalıtımı destekler. |
| Null Değeri | Null olamaz (Nullable<T> hariç). | Null olabilir. |
| Constructor | Parametresiz yapıcı metot (C# 10 öncesi kısıtlı). | Esnek yapıcı metotlar. |
4. Hangisini Ne Zaman Kullanmalısınız?
"Her şeyi class yapalım gitsin" demek kolaydır, ancak performans kritik yerlerde struct hayat kurtarır.
Struct Kullanmanız Gereken Durumlar:
[]Veri yapınız küçükse (genellikle 16 byte'tan az).
[]Nesnenin ömrü kısaysa ve sürekli oluşturulup atılıyorsa.
[]Nesne değiştirilemez (immutable) olacaksa.
[]Örnek: DateTime, int, Color, Vector2.
Class Kullanmanız Gereken Durumlar:
[]Nesne yönelimli programlama (Kalıtım, Polimorfizm) gerekiyorsa.
[]Büyük veri yığınları taşıyorsanız (Sürekli kopyalamak performansı düşürür).- Nesnenin referans olarak paylaşılması gerekiyorsa.
5. Performans Notu: Boxing ve Unboxing
Bir struct yapısını (değer tipi), bir nesneye (object - referans tipi) dönüştürdüğünüzde Boxing işlemi gerçekleşir. Bu, verinin Stack'ten Heap'e taşınması demektir ve maliyetli bir işlemdir. Döngüler içinde gereksiz boxing işlemlerinden kaçınmak C# performans optimizasyonunun temelidir.
C#:
int sayi = 123;
object kutu = sayi; // Boxing (Maliyetli!)
int tekrar = (int)kutu; // Unboxing
Sonuç
Struct ve Class arasındaki seçim, uygulamanızın bellek profilini belirler. Eğer sadece veri taşıyan küçük yapılarla (koordinatlar, para birimleri vb.) çalışıyorsanız Struct kullanarak Garbage Collector üzerindeki yükü azaltabilirsiniz. Ancak karmaşık bir iş mantığı ve hiyerarşi kuruyorsanız adresiniz Class olmalıdır.