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
Cover Image for Sınıflar vs Yapılar: Performans ve Seçim Rehberi

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.

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.

Yığın üzerinde saklanan Yapıları ve Yığından (Heap) referanslanan Sınıfları gösteren diyagram.

Hızlı Karşılaştırma: Referans vs Değer Tipleri

ÖzellikSınıf (Referans Tipi)Yapı (Değer Tipi)
Bellek konumuHeap, nesne işaretçi ile referanslanır1.Stack veya satır içi; veri kendisidir.
AtamaReferansı 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ğerKimliğ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.

Sıkışık bellek, çöp toplama ve hız farklarını vurgulayarak Yapı/Yığın ve Sınıf/Yığın (Heap) bellek tahsisini karşılaştıran diyagram.

Çö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.

RGB, 2D Nokta ve Para gibi küçük, değer-tipi veriler için yapı seçimini ve 16 bayt yönergesini gösteren rehber.

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.

1.
Microsoft Docs, “Choosing between classes and structs,” https://learn.microsoft.com/en-us/dotnet/standard/choosing-between-class-and-struct
2.
Apple Developer Documentation, “Structures and Classes,” https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html
4.
5.
NDepend Blog, “Class vs Struct in C#: Making Informed Choices,” https://blog.ndepend.com/class-vs-struct-in-c-making-informed-choices/
← Back to blog
🙋🏻‍♂️

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.