C#7 Yeniliklere Devam
C# 7 için daha önceki makalelerimizde büyük değişiklikleri görmüştük. Şimdi ise hayatımızı kolaylaştıracak olan güzel dokunuşlar üzerinden geçelim istedim. İlk olarak diğer makalelerimiz üzerinde de durduğumuz out ile başlayalım.
C# 7 için daha önceki makalelerimizde büyük değişiklikleri görmüştük. Şimdi ise hayatımızı kolaylaştıracak olan güzel dokunuşlar üzerinden geçelim istedim. İlk olarak diğer makalelerimiz üzerinde de durduğumuz out ile başlayalım.
OUT
Out parametresi birden çok değişkeni döndürmek istediğimizde kullandığımız anahtar özelliklerin başında geliyordu. Aşağıdaki out dönüşü yapan ufak bir metod tanımladım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
static bool GetRecordStatus(int recordSum,out string strDesc) { if (recordSum>5) { strDesc = "Yüksek Veri Düzeyi"; return false; } else { strDesc = "Alçak Veri Düzeyi"; return true; } } |
Metoddan da anlayacağınız gibi bize bool bir değer ve out olarak string bir ifade dönüyor. Aşağıda da klasik çağrım şeklini görüyoruz.
1 2 3 4 5 6 7 8 9 |
static void Main() { string strArgu; GetRecordStatus(25, out strArgu); } |
OUT işlemlerinde asıl değişim metod tanımında değil. Bu metodun çağrımında olmuştur. Aşağıda görüleceği gibi artık önceden değişken tanımına gerek kalmamıştır.
1 2 3 4 5 6 7 8 9 |
static void Main() { GetRecordStatus(25, out string strArgu); Console.WriteLine(strArgu); } |
Burada out string bildirmek yerine var türünü argüman olarak kullanabilirsiniz.
1 2 3 4 5 6 7 8 9 |
static void Main() { GetRecordStatus(25, out var strArgu); Console.WriteLine(strArgu); } |
Değişkenlerin burada kullanıldığını, sadece sınırlı kapsam içerdiğini, dolayısıyla bunları yöntem dışında kullanamayacağımıza unutmayın.Değişkeni doğrudan argüman olarak tanımlayabildiğimiz için, C# 7.0 bize bunları da var olarak ilan etme özgürlüğünü verir . Dolayısıyla veri türü hakkında endişelenmemize gerek kalmıyor.
Pattern matching (Kalıp eşleştirme)
C# 7 ile birlikte yeni desen eşleştirmeleri sayesinde artık spesifik class veya structure yapılarını case bloklara taşıyabiliyoruz. Fakat null değerler için bir eşleşme yapılamamaktadır. Bunu case blokları içinde kendiniz yakalamak zorundasınız. Kalıp eşleştirme is
ifadeleri ve switch
ifadeleri destekler . Her biri, o nesnenin aranan kalıbı karşılayıp karşılamadığını belirlemek için bir nesneyi ve özelliklerini inceler.
Klasik bir Switch-case yapısı aşağıdaki gibidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
static void Main() { int sayi = 25; switch (sayi) { case 5: Console.WriteLine("5 seçildi."); break; default: break; } } |
Aşağıda da görüleceği gibi artık string ,int vb. veri tiplerinden daha fazlasını kullanabiliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
static void Main() { IArac arac =new Motosiklet(); switch (arac) { case Motosiklet m: Console.WriteLine(m.getAracTipi()+ "2 tekerliklidir."); break; case Araba a: Console.WriteLine(a.getAracTipi() + "4 tekerliklidir."); break; default: break; } } public interface IArac { string getAracTipi(); } public class Araba : IArac { public string getAracTipi() { return "Araba"; } } public class Motosiklet : IArac { public string getAracTipi() { return "Motosiklet"; } } |
throw Expressions
throw ifade eskiden kullanılamazdı. aslında bunun gibi ifadelerde bulunmaktadır. Ama artık expressionlar içinde kullanılabilir hale geldi. Buda artık bize gerçekten yazım kolaylığı getirmektedir. Aşağıda aynı metodun eski ve yeni halini görebilirsiniz.
1 2 3 4 5 6 7 8 |
public bool ThrowDemo(int sayi = 25) { return sayi != 25 ? throw new Exception("Sayı 25 değil"):true; } |
Eski hali görüldüğü üzere daha uzun bir yazım şeklidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public bool ThrowDemo(int sayi = 25) { if(sayi!=25) { throw new Exception("Sayı 25 değil"); } else{ return true; } } |
Sayısal Sözdizimi İyileştirmeleri
Sayısal sabitleri yanlış okumak kodun anlaşılmasını zorlaştırabilir. Bu sıklıkla sembolik olarak kullanıldığında ortaya çıkar. C# ta bu sorunumuza ufak bir çözüm sunmaktadır.
Aşağıda göreceğiniz gibi sayıları “_” ayracı ile basamaklarına ayırabiliriz. double,decimal,float için bu kullanılabilir.
1 2 3 4 5 6 |
public const double AvogadroConstant = 6.022_140_857_747_474e23; public const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M; |
yine bit sayıların kolay okunabilmesi için “_” ayracını yeniden kullanabiliriz.
1 2 3 4 5 6 |
public const int sayi32= 0b0010_0000; public const int sayi64 = 0b0100_0000; |
Başka bir yazıda görüşmek üzere…