C# 6’nın çıkış tarihi yaklaşırken önceki paylaşımlarında olduğu gibi planlanan özeillikleri yanında artık netleşmiş ve CTP’ler ile karşımıza çıkan özelliklerini anlatmanın zamanı geldi. Bu makalemde bu yeniliklerden Auto-Property’ler üzerinde yapılmış olan iyileştirmelerden bahsedeceğim.
C# dilinin gelişimini mercek altına aldığımızda CLR seviyesinde yapılan iyileştirmeler yanında, hatta çok daha fazla şekilde dil yapılarında iyileştirmelerin yapıldığını görebiliriz. Özellikle son iki sürümünde bunu hissettiren C#’ın yeni sürümünde bunu iyiden iyiye hissetmeye hazırlıklı olun. Peki bu iyileştirmelerden kasıt nedir? Ne anlama geliyor?
C#’in daha ilk sürümleriden beri yaklaşımı olabildiğine kolay, aynı zamanda da güçlü bir dil olabilmekti. Kolaylıktan kasıt ise daha declerative (tanımsal) olarak neyin yapılması gerektiğini anlatıp derleyicinin nasıl yapılacağına karar vermesidir. Dile entegre sorgu yapabildiğimiz Linq’in yapısı buna en güzel örnektir. Nesneleri Linq ile sorgularken döngüleri, if’leri düşünmek yerine ne istediğimizi ifade ettiğimizi hatırlayın.
Bu bakış açısı tabi ki yeni sürümde de korunmakta. Daha önceden hızla property oluşturabilmemiz için eklenmiş olan auto-property yapısı bu sürümde detaylarını aşağıda sıraladığım iyileştirmelere kavuştu.
Öncelikle, auto-property kullanımları incelendiğinde çoğunlukla constructer içerisinde ilklendiği görülmekte. Aksi bi kullanım daha seyrek olmakla birlikte, zaten bu gibi durumlarda auto-property yerine doğrudan arka alanda yer alan değişkenlerle desteklenmiş property’lerin kullanıldığını görebiliriz. Durum böyle olunca aynı diğer sınıf veri üyelerinde olduğu gibi auto-property’ler için de ilklendirme desteği geldi. Auto-Property Initializers olarak anlandırılan bu yeni özelliği aşağıdaki şekilde örnekleyebiliriz;
public class Ogrenci { public string Adi { get; set; } = "Fatih"; public string Soyadi { get; set; } = "Boy"; }
Auto-Property initializers için tanımlanan kurallar diğer alanlardakiler ile aynıdır. Derleyicinin arka planda zaten bu yapıları kullandığı düşünülünce oldukça mantıklı. Auto-Property initializers this ise nesnenin kendisine referans veremez. Normal alanlar gibi auto-property’lerin de ilklendirilmesi işlemi henüz nesnenin tam olarak ilklendirilmesi bitmeden yapıldığı için this ile tam oluşturulmamış nesneye refere etmek zaten hataya açık olacaktır. Bu duruma tek istisna daha sonradan değineceğim yeni eklenmiş bir özellik olan primary constructors (birincil ilklendiriciler)’dır.
Auto-Property Initializers’ın dile eklenmesi ile birlikte daha önceden izin verilmeyen salt-getter barındıran yapılar da kullanılabilir oldu. Hatırlarsanız daha önceden auto-property’lerde değeri hiç bir zaman ilklenememiş olacağından aşağıdaki örnekte olduğu gibi sadece getter tanımlanmasına izin verilmiyordu;
public class Ogrenci { public string Adi { get; } public string Soyadi { get; } }
Auto-Property initializer kullanılması durumunda izin verilen getter-only auto-property’ler ise artık aşağıdaki şekilde tanımlanabilir;
public class Ogrenci { public string Adi { get; } = "Fatih"; public string Soyadi { get; } = "Boy"; }
Böylesi bir kullanım sonucu derleyicinin ürettiği kodda property’yi destekleyen arka plan değişkeni doğrudan kullanılamayacağı, dolayısıyla da değeri asla değiştirilemeyeceği için derleyici bu değişkeni salt-okunur olarak tanımlayacaktır. Bu bilgiyi pek çokları için aktif kullanımda işlerine yaramayan bir detay olarak görülse de, mevcut auto-property’ler üzerinden reflection v.b. yöntemlerle arka-plan değişkenine ulaşıp işlem yapam bir altyapınız var ise bunun anlamı baş ağrısı olacaktır. Geriye dönük uyumluluk adına sıkıntılı bir nokta olabilir…
Getter-only auto-property’ler ile ilgili bir diğer güzel nokta da tek ilklendirme yolunun yukarıdaki şekilde auto-Property initializers olmamasıdır. Sonuçta arkaplandaki değişken salt-okunur olaacağı ve sal-okunur değişkenler constructer’larda ilklendirilebileceği için Getter-only auto-property’lerde constructer’lar içerisinde ilklendirilebilirler;
public class Ogrenci { public string Adi { get; } public string Soyadi { get; } public Ogrenci(string adi, string soyadi){ Adi = adi; Soyadi = soyadi; } }
Bu örneği özellikle unutmamanızı istiyorum. Primary constructers konusuna değinirken bu örneğe geri döneceğiz.
Şimdiye kadar paylaştıklarım daha az satırla daha hızlı ve standart kod yazmak adına güzel yenilikler; ama benim konuda farklı bir bakış açım da var. Auto-Property initializers ve getter-only auto-property’lerin C# diline eklenmesi bence immutable types (değişmez türler) konusunda da güzel ve önemli bir adım. Dikkat ederseniz artık auto-property’lerinde bir defa ilklendirilip değiştirilememesi garanti altına alınmış oluyor. Dolayısıyla da daha önceden sadece mutable types (değişken türler) içerisinde kullanabildiğimiz auto-property’leri artık immutable types içerisinde de kullanabilme yeteneğine kavuşmuş olduk.