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.
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.
0 yorum