Mini Seri : C# 7.0 Yenilikleri -2

Tahmini Okuma Süresi: 6 dakika
Serinin ikinci yazısında C# 7.0 ile gelen özelliklere değinmeye devam edeceğim. Tuples, Out Variables, Pattern Matching özelliklerine ilk yazıda  değinmiştim. İlk yazıy aşağıdaki linkten erişebilirsiniz.
Bu yazıda ise diğer özelliklere göz atmaya devam edeceğim.
Local Functions
C# dilinde bir metot içerisinde başka bir metot tanımlamak mümkün mü? Bu sorunun cevabı bir süredir: -Evet.
Delegasyon ile veya lambda kullanarak bu işi yapabiliyoruz. Peki böyle bir ihtiyaç neden oluşuyor. Boyut olarak büyük bir metot ile çalıştığınızı düşünün bu metot içerisinde iş mantığı gereği bazı bölümler kendi içlerinde bir bütünlük sağladığından ötürü bu kısımları ayrı bir metota alarak, belki de sadece bu noktada kullanımı yapılacak bir metot oluşturmuş oluyoruz. Bunun önüne geçmek için ise yukarıda bahsetmiş olduğum Lambda kullanımıyla oluşturulmuş bir method için yaşanan sıkıntılardan birisi erişim belirleyecisi private olmasına rağmen metot dışından erişiminin mümkün olması.

Düzeltme
Yanlışlıkla aynı kod parçasını iki kere koymuşum şu an yukarıdaki kod bloğunda lambda kullanımı örneklenmekte aşağıdaki versiyonu ise c#7.0 ile bizlere sunulan local fonksiyonunun aynı işi yaptığı kullanımı, uyarısı için Doğan Kasap’a teşekkürlerimi iletirim.

Yukarıdaki kod bloğu işimizi görüyor olsa da lambda kullanmanın maliyeti fazla olduğundan ötürü, daha uygun bir çözüm olması bakımından c# 7.0 ile birlikte local functions kavramı tanıtıldı.

şeklinde bir tanım yapmak mümkün oldu. Local fonksiyonlara erişim belirleyicisi ekleyemiyoruz. Kapsamı içeriğinde kullanımının garanti edilmesi için böyle bir kısıtlama gerekli. Bu işi Lambda ile yaparak ekstradan bir delegasyon yapmak durumunda olduğumuz için performans açısından bir kayıp söz konusu idi. Local fonksiyonlar ise klasik fonksiyon davranışı sergilediğinden ötürü bu tarz bir “allocation” işlemine ihtiyaç duymamaktadır. Lambda kullanımında recursive(özyineleme) bir çağrım yapmak mümkün fakat kodun okunabilirliğini azaltan bir uygulama gerektiriyor. Bunun yanında generic, iterator olarak kullanılabilme gibi avantajları da lokal fonksiyonlar bizlere sağlamaktadır.

Expression-bodied members
C# 6.0 versiyonu ile duyurulan özelliğin kapsamı genişletildi. 6.0 versiyonunda metotlar ve özellikler için geçerli olan bu kullanım biçimi, C# 7.0 ile birlikte yapıcı metotlar (constructors), yıkıcı metotlar (deconstructors), ve özellik erişimcileri (accessors), olaylar (Events) için de geçerli olmaya başladı.
C#6.0‘da bir özellik tanımı şu şekilde yapılmaktaydı.
c# 7.0 ile birlikte şu şekilde kullanım da mümkün hâle geldi.

c#6.0 ‘da

şeklinde bir yapıcı metot tanımı yapıyorken,

c#7.0‘da
şeklinde tanım yapmak mümkün hâle gelmiştir.
Bu kullanım tarzıyla amaçlanan üretkenliğin artırılması. Kod yazımının ve okunmasının kolaylaştırılmasıdır.
Literal İmprovement
Bir diğer gelişme ise literal(harf dizisi) ifade ediliş biçimleri ile ilgili. “_” ile basamak ayrımlarının yapılmasına olanak verilmeye başlandı.
Örneğin;
var amount = 123_456_789;
gibi bir ifade geçerli olmaktadır. Bu kullanım biçimiyle okumayı kolaylaştırmak hedeflenmektedir. Ayrıca binary literals kavramı da bizlerle tanıştırıldı. İkili katarlar uzun ve okuması zor olduğu için, bu tarz kullanımlarda katarın okuması bir nebze kolaylaşacaktır.
var binary_sample = 0001_1100_1010_1111; 
gibi bir kullanım da artık geçerlidir.
Async return types
Async/await deseninde c#7.0 öncesi sadece Task, Task<TResult>, void  tipleri desteklenmekteydi. Fakat asenkron bir metottan geriye Task dönmek bir takım darboğazlar oluşturmaktaydı.
c#7.0 ile birlikte diğer tiplerinde bu desende dönüş tipi olarak kullanılabilmesine imkân sağlanmıştır. Task tipinin referans tipi olmasından ötürü performans bakımından çeşitli kayıplara yol açtığı durumlar olabiliyordu. Yeni kullanımda diğer tiplerde sonuç döndürmek mümkün. Fakat yine async/await desenini uygulamak zorundadır. Bunun için ValueTask tipi .NET Framework’e eklendi.

ValueTask tipi  System.Threading.Tasks.Extensions isim uzayında yer almaktadır. Kullanabilmek için Nuget Package Manager ile ilgili referansı projeye eklemek gerekmektedir.

Mini serinin ikinci yazısında c#7.0 ile diğer gelen özelliklere değinmeye çalıştım. Ana başlıklar olarak öne çıkan özelliklerin üzerinden geçmiş oldum. Faydalı olması dileğimle.

2 Replies to “Mini Seri : C# 7.0 Yenilikleri -2”

  1. Hocam merhaba, yazılarınız gayet bilgilendirici. Özellikle fularlı olanlar ve olmayanlar konuları. 😀

    Local Functions bölümünde iki kod alanında da aynı kodlar mı yer alıyor yoksa ben mi orayı anlayamadım bir sorayım dedim.

    Tekrardan teşekkürler.

    1. 😉 Yorumun için teşekkürler. Şimdi baktım yanlışlık yapmışım. Aslında oradaki kodlardan birisi c#7.0 öncesine diğeri de c#7.0’a ait olmalıydı.Hemen düzeltiyorum. Dikkatin ve uyarın için teşekkür ederim.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir