.Net Core’da C# 7.0 Pattern Matching

Selamlar Arkadaşlar,

Bugün .Net Core Console bir uygulamada, C# 7.0 ile gelen benim de iş hayatında bolca kullandığım Pattern Matching üzerine farklı örnekeler ile konuşacağız. Öncelikle alttaki komut ile ilgili uygulama oluşturulur.

İlk başta gelin alttaki gibi bir Person sınıfı oluşturalım.

“is” Operator’ünü Pattern Matching ile kullanma: 

Bu operatör C#’ın ilk verisyonundan beri, alınan objenin belirlenen bir türle uyumlu olup olmadığını konturol etmek için kullanılır. Yani dönüştürülecek nesnenin, istenen türe ait interfaceden ya da base class’dan türeyip türemediğine bakar. Dönen değer “true” veya “false” tur. C# 7 ile artık “is” operatörü, desenleri kontrol etmek için de kullanılabilir. Aşağıda farklı tiplerde eleman barındıran bir object[ ] array data dizisi bulunmaktadır.

  • Const Pattern : İlgili pattern’de, direk bir sayı veya null değer kontrolü yapılabilir.

Aşağıda, yukarıdaki data[ ] dizisindeki elemanların IsPattern() methodundaki kontrolünden sonraki çıktısı gösterilmiştir.

  • Type Pattern: Konturol edilecek nesnenin, istenen türle uyumlu olup olmadığına bakılır. Const pattern’inden tek farkı, eğer desen ilgili tip ile eşleşir ise nesne belirtilen türün yeni bir değişkenine atanır. Örneğin aşağıda sayısal olan tipler ekrana bulunup basılmıştır.

Bir diğer örnek de Person sınıfına ait dizi elemanlarının isimlerinin ekrana basılmasıdır.

Bu iki pattern’a ait ekran çıktısı aşağıdaki gibidir.

Peki adı “Bo” ile başlıyan, Person sınıfına ait bir elemanı ilgili data [ ] dizisi içinde bulmak istese idik ne yapacaktık? Önce person tipine bakılıp, daha sonra && operator’ü ile istenen diğer koşullar aşağıdaki örnekde olduğu gibi peşi sıra eklenmelidir.

Var Pattern :

Diyelim ki, data [ ] dizisi içindeki tüm nesnelerin türü ekrana yazdırılmak isteniyor. Bakılacak tür için “var” anahtarı kullanıldığında, nesne her zaman bir türe sahip olduğu için, bu desen bize sadece true değerini döner. Ama esas amaç, nesnenin GetType() methodu ile hangi tipe ait olduğunun bulmak ve ekrana adını basmaktır. Aşağıdaki örnekde, null olan değerler için hataya düşülmemesi için soru ? işareti ile Not: “x?.GetType( )?.Name” şeklinde kullanılmıştır.

Pattern Matching’de Switch Statement Kullanılması :

Her zaman kullanılan switch ifadesi geliştirilerek, artık değişken tipine göre de ayırt edebilecek şekilde tanımlanmıştır. Ayrıca istenir ise, aranılan türün dışında “when” anahtar kelimesi de kullanılarak, aynı &&‘da olduğu gibi ekstra koşullar, sona doğru eklenerek arttırılabilir. Örneğin aşağıda “Person” sınıfına uyan ve Adı “Bo” ile başlayan şeklinde bir koşul kolaylıkla yaratılabilmiştir.

Böylece eskiden aynı işi yapmak için yazdığımız kodlar “is“, “const“, “Type“, “var” ve “switch / case patternleri’i ile iyice kısalmaya başlamıştır. Aslında C# 7.0,  daha en baştan bu özellikleri destekleyecek şekilde geliştirilmiştir. İlerde Sub-patterns, property patterns, positional patterns ve son olarak recursive patterns gibi daha nice patternlerin karşımıza çıkma ihtimali mevcuttur.

Olabilecek Patternler için Örnek Github: https://github.com/dotnet/csharplang/blob/master/proposals/patterns.md 

Geldik bir makalenin daha sonuna. Yeni bir makalede görüşmek üzere hoşçakalın.

Source: https://github.com/dotnet/csharplang/tree/master/proposals

Source Code: https://github.com/borakasmer/PatternMatching

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. Ali dedi ki:

    Elinize saglik hocam. Peki object tiplerin performans sorunu yarattigi konusundaki gorusunuz nedir? Baslangicta hangi tur olacagi bilinmiyor deniliyor. Boxing ve unboxing işlemlerinin yapılması gerektiğini biliyoruz objectlerde.

    Aynı şekilde 4.0 ile gelen dynamic ile de kullanılabilir mi?

    • borsoft dedi ki:

      Öncelikle teşekkürler ve Selamlar Ali,

      Dynamic ile bu konu biraz farklı. Hangi tipde olucağı bilinmeyen tipler her zaman bellekte yani remde çok yer kaplar. Objecttin de tipi belli değildir.
      Ama Pattern Matching’de böyle bir durum yok. Gelen tipe göre farklı işler yapılıyor. Yani Boxing Unboxing yerine, arkada sadece GetType() işlemi var. Bu da performansdan ödün vermiyor.

      İyi çalışmalar.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.