Primary constructor'lar sözdizimi şekerinden fazlası
Geleneksel bir constructor yerine primary constructor kullanmak, alanların ne zaman atandığını değiştirebilir. Bu fark, base constructor içinden sanal üyeler çağrıldığında davranışı etkiler. Steven Giesel, derleyicinin ürettiği kodu inceleyerek farkı gösteriyor.
Kilit noktalar
- Primary constructor'da parametre, base constructor çağrılmadan önce gizli bir alana kopyalanır.
- Klasik constructor'da alan atanması base constructor döndükten sonra gerçekleşir.
- Base constructor sanal bir üyeyi çağırıyorsa klasik yapıda derived alan null görünebilir.
- Derleyicinin ürettiği <count>P alanı readonly değildir ve yeniden atanabilir.
- Readonly alan için alan başlatıcısı kullanılabilir, ancak parametre hem üyede hem başlatıcıda kullanılırsa CS9124 uyarısı çıkar.
Primary constructor, parametrelerini doğrudan sınıf üyelerinde kullanabildiği için yalnızca kısa bir yazım kolaylığı gibi görülebilir. Yazar, base constructor'ın sanal bir üyeyi çağırdığı bir senaryoda klasik constructor ile primary constructor'ın farklı sonuç verdiğini gösteriyor. Klasik yapıda alan, base constructor döndükten sonra atanırken; primary constructor'da derleyici parametreyi base çağrısından önce gizli bir alana kopyalıyor.
Bu sıralama farkı bUnit gibi gerçek projelerde hata mesajlarını bile değiştirebiliyor. Yazar ayrıca derleyicinin ürettiği alanın readonly olmadığını ve alan başlatıcısının da aynı sıralamayı izlediğini, ancak parametreyi hem üyede hem alan başlatıcısında kullanmanın CS9124 uyarısına yol açtığını belirtiyor. Kendi kodunuzu gözden geçirirken bu sıralamayı akılda tutmanız yeterli.
Gerçek dünyada kullanımı
- Base constructor'ında timer başlatan ve sonra sanal bir özelliği okuyan bir kütüphane geliştirirken
- Test yardımcısı veya bileşen tabanlı bir sınıf hiyerarşisinde derived sınıfın parametrelerini base davranışına geçirirken
Neden önemli
Primary constructor'a geçerken base constructor'ın sanal üye çağırdığı yerlerde davranışın değişebileceğini bilmek gerekir. Yazım kolaylığı tek başına eşdeğerlik garantisi vermez.
Benzer haberler
- C# interface'lerinde collection dönüş tipleri: interface, view ve snapshot farkıNick Cosentino (Dev Leader)2 gün önce
- C# ile dinamik Gauss-Legendre sayısal integrasyonu: düğüm ve ağırlıkları taşma olmadan anında hesaplamakHabr C# (ru)2 gün önce
- C# olayları ve delegate'ler: sözleşme, abonelik ve bildirimNick Cosentino (Dev Leader)3 gün önce