Sınıflar ve yapılar arasındaki temel farkı kısa sürede kavrayın: sınıflar referans tipi, yapılar değer tipidir. Bu karar bellek düzenini, kopyalama davranışını ve çalışma zamanı performansını doğrudan etkiler. Bu rehberde C#, C++ ve Swift’te ne zaman yapı, ne zaman sınıf seçileceğini, bellek ve önbellek sonuçlarını ve yaygın performans tuzaklarını örneklerle açıklıyoruz.
January 29, 2026 (5mo ago) — last updated June 15, 2026 (29d ago)
Sınıflar vs Yapılar: Performans ve Seçim Rehberi
C#’ta class vs struct, Swift ve C++ farkları ile bellek, önbellek ve GC etkilerini öğrenin; ne zaman yapı, ne zaman sınıf seçileceğini keşfedin.
← Back to blog
Sınıflar vs Yapılar: Bir Geliştiricinin Performans Rehberi
Özet: Sınıflar ile yapılar arasındaki temel farkları ortaya çıkarın. C#, Swift, C++, ve daha fazlasında yüksek performanslı, temiz kod için her birini ne zaman kullanacağınızı öğrenin.
Giriş
Sınıflar ile yapılar arasındaki temel fark basit ama belirleyicidir: sınıflar referans tipleridir ve yapılar değer tipleridir. Bu ayrım, C#, C++ ve Swift gibi dillerde bellek düzenini, kopyalama davranışını ve çalışma zamanı performansını belirler. Doğru seçimi yapmak, öngörülebilir kod, daha iyi önbellek yerelliği ve düşük çöp toplama baskısı sağlar. C#’ta sınıf ve yapı ayrımı dil düzeyinde tanımlanmıştır1, Swift değer-öncelikli tasarımı teşvik eder2.
Temel Farkı Anlamak
Bir sınıf örneklendiğinde, o değişken yığındaki (heap) nesneye işaret eden bir referanstır. Atama, referansı kopyalar; böylece birden fazla referans aynı nesneye işaret edebilir. Bu, sınıfların kimliğe sahip varlıklar için uygun olmasının ana nedenidir1.
Bir yapı ise verinin kendisini temsil eder. Yapılar genellikle değişkenin bulunduğu yerde saklanır, dolayısıyla kopyalandıklarında bağımsız çoğaltımlar oluşur. Kopyayı değiştirmek orijinali etkilemez; bu, yapıları küçük, değişmez değerler için ideal kılar1.

Hızlı Karşılaştırma: Referans vs Değer Tipleri
| Özellik | Sınıf (Referans Tipi) | Yapı (Değer Tipi) |
|---|---|---|
| Bellek konumu | Heap, nesne işaretçi ile referanslanır1. | Stack veya satır içi; veri kendisidir. |
| Atama | Referansı kopyalar. | Tüm değeri kopyalar. |
| Ömür | Çöp toplayıcı tarafından yönetilir veya manuel silme gerekir. | Kapsam dışına çıkınca veya satır içi saklandığında serbest bırakılır. |
| Kimlik vs değer | Kimliği vardır; eşitlik kimliğe bağlı olabilir. | Değer odaklı; eşitlik genellikle verilere bağlıdır. |
Paylaşılan kimliğe ihtiyaç duyduğunuzda sınıf kullanın, yan etki olmadan kopyalanabilen basit bir değere ihtiyaç duyduğunuzda yapı kullanın.
Bu ayrım, yığın ve heap tahsisi, önbellek yerelliği ve çöp toplama baskısı gibi performans etkilerini belirler; aşağıda bunları detaylandırıyoruz.
Bellek Tahsisi ve Performans
Bellek düzeni CPU verimliliğini etkiler. Sınıflar genellikle bir işaretçi dolayımı gerektirir, bu da önbellek kaçışlarını artırabilir. Yapılar, diziler halinde ardışık düzenlendiklerinde önbellek isabetlerini ve işlem hacmini iyileştirir. Özellikle yoğun veri işleme yollarında ardışık değer düzeni büyük avantaj sağlar5.

Çöp Toplama Maliyetleri
Heap tahsisi çöp toplama etkinliğini etkiler; sık kısa ömürlü nesne oluşturma, GC baskısını artırır ve gecikmeye yol açabilir. Bu yüzden kısa ömürlü, sık oluşturulan küçük öğeler için değer tipleri tercih etmek heap churn’ü azaltır ve GC işini hafifletir3.
Heap tahsisi GC yükü ekleyebilir. Yapılar, kutulanmadıkları sürece bu yükten kaçınır4.
Önbellek Yerelliği ve İşlem Hacmi
Modern CPU’lar önbelleklere dayanır. Ardışık saklanan yapılar, belleğe erişimlerin daha sık önbellek isabetiyle sonuçlanmasını sağlar; ayrı ayrı heap tahsisleri veri dağılımına, önbellek kaçışlarına ve yavaşlamaya yol açabilir. Özellikle yüksek hacimli döngülerde ve veri işleme boru hatlarında yapılar tercih edilmeli, bellek düzeni optimize edilmelidir5.
Kutulama (Boxing) Tuzakları
Bir değer tipi referans tipine dönüştüğünde kutulama oluşur; bu durum bir heap tahsisine ve kopyalamaya neden olur. Kutulama, değer tiplerinin sunduğu performans kazanımlarını iptal edebilir, bu yüzden kutulamayı tespit etmek ve önlemek önemlidir4.
Diller Arası Farklılıklar: C#, C++ ve Swift
Farklı diller farklı gelenekler ve kurallar uygular. Dil-spesifik davranışları anlamak, diğer dillerin kurallarını doğrudan uygulamaktan kaçınmanıza yardımcı olur.
C#: Net Referans vs Değer Modeli
C#’ta class referans tipi, struct değer tipidir. Kimliğe sahip varlıklar için sınıfları kullanın, küçük değişmez veri paketleri için yapıları tercih edin. Yapıları küçük ve değişmez tutmak, kopyalama maliyetini ve beklenmeyen davranışları azaltır1.
Yaygın hatalar: büyük veya değiştirilebilir yapılar oluşturmak, bu da performans düşüşüne veya mantık hatalarına yol açabilir.
C++: Gelenek ve Esneklik
C++’ta struct ve class arasındaki fark sadece varsayılan erişim düzeyidir. Her ikisi de stack veya heap üzerinde tahsis edilebilir. Geleneksel kullanım, düz veri kümeleri için struct, kapsüllenmiş nesneler ve RAII için class’dır. C++ esnekliği, geliştiricinin tasarım kararlarına dikkat etmesini gerektirir.
Swift: Değer Odaklı Varsayılan
Swift, çoğu durumda yapıları tercih etmeyi teşvik eder; yapılar metotlar, uzantılar ve protokollerle güçlü bir şekilde çalışır. Referans semantiği yalnızca kimlik veya Objective‑C birlikte çalışabilirliği gerektiğinde seçilmelidir. Bu değer-öncelikli yaklaşım, eşzamanlı kodda değişmezlik sayesinde daha güvenli ve öngörülebilir davranış sağlar2.
Ne Zaman Yapı Seçilmeli
Yapılar, kimliği tamamen değerleriyle tanımlanan küçük, değişmez veri paketleri için uygundur. Tipik örnekler:
- Geometrik veriler: Point2D veya RGBColor
- Finansal değerler: Money (tutar + para birimi)
- Yüksek işlem hacimli borularda kullanılan küçük DTO’lar
Pratik bir boyut yönergesi olarak 16–32 bayt arası bir sınır kabul edilebilir; bu aralık kopyalama maliyetini genellikle makul tutar. Daha büyük veya sık değiştirilen tiplerde sınıf tercih edin5.

Değişmezlik ve Boyut Kuralları
- Değişmez yapıları tercih edin, böylece durum kazaları azalır.
- Yapıları küçük tutun; büyük yapıları sık kopyalamak maliyetli olur.
Bu kurallar, gizli hataları ve aşırı kopyalamayı önlemeye yardımcı olur.
Yaygın Tuzaklar ve Yeniden Düzenleme
İki yaygın problem değiştirilebilir yapılar ve aşırı kutulamadır. Değiştirilebilir yapılar beklenmeyen davranışlara yol açar; bu tipleri değişmez hale getirerek veya metodları saf fonksiyonel biçime dönüştürerek yeniden düzenleyin. Kutulama noktalarını tespit edin ve kaldırın ki yapıların performans avantajları korunabilsin.
Örnek: Mutable Point → Immutable Point (C#)
// PITFALL: Mutable struct
public struct MutablePoint
{
public int X { get; set; }
public int Y { get; set; }
public void Move(int dx, int dy)
{
X += dx;
Y += dy;
}
}
// REFACTOR: Immutable struct
public readonly struct ImmutablePoint
{
public int X { get; }
public int Y { get; }
public ImmutablePoint(int x, int y)
{
X = x;
Y = y;
}
public ImmutablePoint MovedBy(int dx, int dy)
{
return new ImmutablePoint(X + dx, Y + dy);
}
}
Bu yeniden düzenleme niyeti belirginleştirir ve kazara durum bozulmasını ortadan kaldırır. Daha fazla temiz kod uygulaması için rehberlerimize bakın: https://cleancodeguy.com/blog/clean-coding-principles.
Sıkça Sorulan Sorular
S1: Bir yapı yerine ne zaman sınıf tercih etmeliyim?
Tip büyükse, kimlik gerekiyorsa veya sıkça paylaşılacak bir kaynaksa sınıf tercih edin. Küçük, değişmez veri için yapı uygundur1.
S2: Kutulamayı nasıl tespit ederim?
API’lerinizi inceleyin; referans bekleyen koleksiyonlara değer tipleri koymak kutulamaya neden olur. Profil araçlarıyla heap tahsislerini izleyin4.
S3: Performans kararlarını dil kurallarına göre nasıl veririm?
Dil belgelerini ve en iyi uygulamaları takip edin: C# için struct-class ayrımına, Swift için değer-odaklı yaklaşıma ve C++’ta geleneksel kullanıma dikkat edin12.
Clean Code Guy olarak, bu ilkeleri gerçek kod tabanlarına uygulamanıza yardımcı oluyoruz. Kod Tabanı Temizlemelerimiz ve AI‑Hazır Yeniden Düzenlemelerimiz yazılımı daha hızlı, daha güvenli ve bakımı daha kolay hale getirir. Daha fazla bilgi için ziyaret edin: https://cleancode.com.
AI kod yazar.Siz onu uzun süre dayanır hale getirirsiniz.
AI hızlanması çağında, temiz kod sadece iyi bir uygulama değil — ölçeklenen sistemlerle kendi ağırlığı altında çöken kod tabanları arasındaki farktır.