top of page
Writer's picturehacer_bakirci

C#'da Tuple Types ve Deconstruction

C# 7 ve sonraki sürümlerde karşımıza çıkan bu özelliğe, çok sayıda datayı daha kısa bir syntax ile gruplayabileceğimiz bir veri yapısıdır diyebiliriz.

Hayatımıza kattığı şey ise bir metotdan birden fazla değer döndürmek istediğimizde out parametresini kullanmadan bunu yapabilmek.

Ayrıca metoda birden fazla değeri tek bir parametrede geçebilmemizi de sağlıyor.

Değer tipli olan (struct) bu veri yapısını önceki sürümlerde kullanabilmek için nuget store'dan System.ValueTuple kütüphanesi eklenebilir.

Basitçe bir tuple değişken tanımlayıp bu değişkenin değerini ve tipini consol ekranına yazdırıp bir görelim;







Kodun çıktısı :


Tuple içindeki fieldlara yani eklediğimiz elemanlara direkt erişebiliyoruz :


Fieldların default adı Item1,Item2 .. şeklinde tutuluyor fakat eğer istersek isim belirleyebiliyoruz.

Yukarıdaki listede gördüğümüz "Equals" C# 7.3 sürümünde eklenmiş ve böylece tuple tipleri ==, != operatörlerini destekleyebiliyor duruma gelmiş. Arka planda yaptğı iş ise tuple elemanlarının sırasını takip ederek karşılaştırma yapmaktadır.


Tuple değişkenine istediğimiz sayıda eleman ekleyebiliyoruz.












Yukarıda field isimlerinin belirlenebileceğinden bahsetmiştik. Aslında tuple, atama ve karşılaştırma işlemlerinde field isimlerini hesaba katmıyor yani çalışma zamanında bizim belirlediğimiz field isimleri kullanılmıyor. Yine compile time'da bizim yazdıklarımızla default isimleri mapliyor.

Kendi verdiğimiz field isimleriyle devam etmek istersek explicit olarak initialization ifadesi içinde şu şekilde tanımlayabiliriz;











Tuple kullanımının esas kullanım alanı, metottan dönmesini istediğimiz birden çok değeri bir tuple içinde gruplayarak tek parametrede döndürmek.

Ufak bir örnekle bu kullanımı da görelim;















Buradaki örnekte aslında birbiriyle ilişkili datalar kullandım, fakat daha çok birbiriyle ilişkili olmayan elemanları gruplamak için tuple kullanmak daha mantıklı. Ayrıca daha çok private veya internal metotlarımızda kullanmak daha mantıklı. Public bir API yazıyorsak class veya structlar bakidir :)


Peki, metottan döndüğümüz tuple, çok fazla eleman içeriyorsa, her elemanı tek tek mi handle edeceğiz? Yani her elemaniçin değişken mi tanımlamız gerekiyor?

Bu işlem epey maliyetli duruyor tabi ki...

Bu durum için "Deconstruct" operatörü kullanabiliriz. Deconstruction yaptığımızda direkt tuple içindeki elementleri değişkenlere atayabiliyoruz.


Deconstruction dediğimiz olay değer veya referans tiplerini birden fazla parçaya bölme ve bunları yeni değişenlere atama işlemidir.

Bu işlemi ayrıca kendi yazdığımız classlarda, structlarda veya interfacelerde de kullanabiliriz.

Tuple ise otomatik olarak deconstruction işlemini uygulamaktadır. Yani tuple döndüren metottan aldığımız değerleri istediğimiz field ismi vererek tiplerini bile belirtmeden alabiliyoruz. Yine ufak bir örnekle görelim;

















Deconstructor operatörünü bir de non-touple tipte mesela bir class'ta görelim;


























Buraya kadar tuple'ın System.ValueTuple versyonunu inceledik. Bir de System.Tuple sınıfı mevcut.

Tuple<T1,T2,T3,T4,T5,T6,T7,TRest>

Bu versyonda Tuple direkt olarak 1'den 7'ye kadar elemet içreriyor. 7'den fazla element için Rest property'sine nested (iç içe) tuple lar olarak yerleştiriliyor.

Bunlara nested tuple da denilebilir.

Yine tuple oluşturmak istediğimizde bu sınıfı kullanabiliriz.

Örneğin, 8-tuple bir değişken oluşturalım;









Bence gayet keyifli :)

Comments


bottom of page