Struct vs Class: Değer Tipi Seçimi Hakkında Yaygın Yanılgılar

Struct kullanmak daha hızlı, class daha yavaş, bu söylem yazılım dünyasında o kadar yaygınlaştı ki, birçok geliştirici bunu sorgulamadan kabul ediyor. Ama gerçek çok daha incelikli.

Performans Mitosu

Evet, struct stack'te, class heap'te yaşar. Stack erişimi teorik olarak daha hızlıdır. Ama pratikte? Bir struct'ı method'a geçirirken (pass by value) tüm veri kopyalanır. Eğer struct 100 byte'sa, her çağrıda 100 byte kopyalanır. Heap'teki class'ın referansını geçmek (8-16 byte) çok daha ucuzdur. Garbage collection maliyeti ise struct kullanımının kopyalama maliyetini gölgede bırakabilir.

Microsoft'un rehberi açıktır: struct'ı 16 byte'dan küçük, değişmez (immutable) ve sık sık kopyalanmayan tipler için kullan. Kural budur, istisna değil.

Tasarım Kararı Olarak Struct

Struct'ın asıl amacı, semantiktir. `DateTime`, `Point`, `Color` gibi tipler struct'tır çünkü bunlar değerdir. Bir tarihin kopyası, orijinalinden farklı değildir. Ama bir `Customer` veya `Order` class olmalıdır çünkü kimlik önemlidir, iki müşteri aynı veriye sahip olsa bile farklı varlıklardır.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Struct'ı yanlış yerde kullanırsan, kod bakımı cehenneme dönüşür. Struct'ı List'e koyarsan, kutulanma (boxing) gerçekleşir, performans kaybı. Struct'ı değiştirebilir (mutable) yapıp koleksiyonda tutarsan, beklenmedik davranışlar ortaya çıkar. Struct'ı kalıtım için kullanmaya çalışırsan (interface dışında), dil seni engeller, bu bir neden vardır.

Gerçek Dünya Seçimi

Struct, değer semantiği gerektiğinde seçilir:
- Sayılar, koordinatlar, tarihler
- Küçük, değişmez veri yapıları
- Performans kritik döngülerde (milyonlarca işlem)

Class, kimlik semantiği gerektiğinde seçilir:
- İş mantığı nesneleri
- Durum taşıyan varlıklar
- Kalıtım ve polimorfizm gereken yerler

Sonuç

Struct'ı seçmek tasarım kararıdır, optimizasyon değildir. Eğer nedenini açıklayamazsan, "değer tipi olması gerekiyor" demek yeterlidir, muhtemelen class kullanmalısın. Performans endişesi varsa, profiler aç. Genellikle struct seçimi sorunu çözmez; yeni sorunlar yaratır.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz