C# 7 — Tuple

ibrahim seçkin
Kodcular
Published in
5 min readMar 1, 2020

Bu yazımda C# dilinin 7.versiyonuyla gelen en önemli özelliklerden biri olan ve günlük hayatta en çok kullandığım “Tuple” tipinden bahsedeceğim.

Tuple nedir?

“Tuple” aynı veya farklı tipten birden fazla elemanı içerebilen bir veri yapısıdır. Aslında bu tanıma baktığımızda bize “class” tanımını çağrıştırıyor gibi görünebilir. “Tuple” veri yapısı sayesinde yeni bir “class” yaratmadan da birden fazla tipteki elemanı aynı veri yapısı içerisinde tutabiliyoruz.

C# 4.0 ile Tuple Kullanımı

Tuple veri yapısı C# dilinin 4.versiyonuyla yani C# 4.0 ve .Net Framework 4.0 ile hayatımıza girdi. C# versiyonlarının tarihçesine bakmak için stackoverflow linkini buraya ekliyorum.

Öncelikle C# 4.0 ile kod örnekleri vererek “Tuple” veri yapısını nasıl kullandığımızı gösterelim.

Yukarıdaki kod parçasında “Tuple” tipinden bir değişken yaratmanın örneğini verdim. Örnekten de görülebileceği gibi ilklendirme (initialization) yoluyla veya Tuple.Create methodu çağırarak “Tuple” tipinden bir değişken yaratabiliyoruz.

C# 7 kısmına geçtiğimizde daha çok üstünde duracağımız ama olayın sebebini daha iyi anlamak için burada da vurgu yapmak gerekir. Yukarıdaki kod parçasını okumak ve anlamlandırmak oldukça zor. “personInformation” tipindeki 3.özellik olan “5” sayısı neyi simgeliyor sorusuna yukarıdaki kod parçası cevap veremiyor. C#7 yeni özellikleriyle gelmeden önce, bu okunabilirlik sorunu sebebiyle mümkün olduğu kadar “Tuple” kullanmamayı, kullanmak zorunda kalıyorsak da yorumlar ile “Tuple” içinde tutulan değişkenlerin neyi simgelediğinin yazılmasını istiyorduk.

C# dil desteği olarak bir “Tuple” tipinde 8 özellik tutabilmemize imkan sağlıyor. 8'den fazla tutmak istiyorsak Tuple içinde Tuple gibi çabalar ile bu sayıyı arttırabiliriz ama 8'den fazla özelliğin tutulduğu bir “Tuple” ne kadar doğru bir kullanım olur ben pek emin değilim.

“Tuple” değişkeninin özelliklerine ulaşabilmek için de “değişken adı . item1,2,3..” şeklinde bir kod yazmamız gerekiyor.

“Tuple” bir veri yapısı olduğu için methodlardan sonuç olarak döndürülebilir. “Tuple” tipinden bir sonuç dönen methodu içeren kod parçasını aşağıda paylaşıyorum.

“Tuple” tipi aynı zamanda methodlara parametre olarak da geçirilebilir. Bu kullanım için basit bir kod parçası örneğini aşağıda paylaşıyorum. (Veri tabanı kodu yazmak istemediğim için methodun içini boş bıraktım)

Bu methodu çağıran kod parçası, methodun dönüş değerini kullanmak istediğinde daha önce gösterdiğimiz gibi “değişken adı . item1,2,3..” diyerek kullanabiliyor.

C# 7 ile Tuple Kullanımı

Yukarıdaki bölümde C# 4.0 ile gelen “Tuple” tipinin nasıl kullandığından bahsettik. Yukarıda kısaca değindiğimiz kullanımın dezavantajlarından bahsetmek gerekirse;

  • “Tuple” tipindeki özelliklere isim veremediğimiz için sürekli olarak Item1,2.. şeklinde ulaşmamız gerekiyor. Bu sebeple de “Tuple” kullanımında kod okunabilirliği azalıyor.
  • Yukarıda bahsetmediğimiz ikinci bir dezavantaj da olası performans dezavantajı. C#4.0 ile gelen “Tuple” veri yapısı, referans tipinde bir yapı olduğu için memory’nin “heap” kısmında saklanıyor. Bu sebeple kullanımı bittiği zaman “garbage collector” dediğimiz yapı “Tuple” tipindeki değişkenleri silmeye çalışıyor. “Garbage collector” çalışma mekanizması ekstra bir performans yükü getirdiği için, performansın önemli olduğu uygulamalarda sıkıntı yaratabilir.

Bu sıkıntılardan dolayı C# dilinin 7.versiyonu bu iki sıkıntıyı da çözdü ve “Tuple” tipinin kullanımı hem kolaylaştırdı hem de daha performanslı bir yapıya kavuşturdu.

Öncelikle performans kısmına değinelim. C#7 ile gelen “Tuple” değer tipinde bir yapı olduğu için memory’nin “stack” dediğimiz kısmında tutuluyor ve “Garbage Collector” mekanizmasını çalıştırmadığı için performans olarak bir avantaj sağlayabilir.

Performansın bu denli kritik olduğu uygulamalar geliştirmediğim için yukarıda bahsettiğim avantaj benim o kadar ilgimi çekmiyor ama okunabilirlik konusunda getirdiği avantaj C# dili ile kod yazan bütün yazılımcılara kolaylık sağlayabilir.

C# 7 ile “Tuple” veri yapısında tuttuğumuz özelliklere isim verebiliyoruz ve “Tuple” değişkenini kullanırken de bu isimler vasıtasıyla özelliklere erişebiliyoruz. “Tuple” veri yapısını çoğunlukla methodlardan birden fazla sonuç dönebilmek için kullandığımızı söylemiştik. Kod örneğini de bu kullanım üzerinden verelim.

Yazının yukarıdaki kısmında C# 4.0 ile yazmaya çalıştığımız kodun aynısını C# 7 ile yazdık. Görüldüğü üzere arada ciddi manada okunabilirlik farkı var. (Ekstra olarak yorum eklememe gerek kalmadı).

Yazdığımız method sonuç olarak bir çalışanın bilgilerini dönüyor ama dönüş yaptığı özelliklerin hepsine isim verebiliyoruz. Aynı amaca hizmet eden başka bir kullanımı da örnek vererek göstermek istiyorum.

Method dönüş değerlerine isim vermemiş olsa bile, yarattığımız “Tuple” değişkenine isim vererek de kullanabiliyoruz.

Daha önce de değindiğimiz gibi “Tuple” veri yapısı çoğunlukla methodlardan birden fazla sonuç dönmek istediğimizde kullandığımız bir yapı. C# dilinde bunu yapmaya olanak veren başka bir yapı da “out” parametreleri. “out” parametreleri kullanarak da aynı method birden fazla sonuç dönebiliyor. “out” parametreleri kullanmanın birden fazla sakıncası var ama ben en çok tecrübe ettiğim ve canımı yakan durumdan bahsedeyim. “out” parametresi olan bir methodu “async” yapmamız mümkün değil. Bu sebeple, yeni gelen özellikleriyle çok daha okunabilir hale gelen “Tuple” kullanımını “out” kullanımına karşı şiddetle tavsiye ediyorum.

Not: Yukarıdaki kod parçalarını Visual Studio 2019 ile yazdığım için ekstra olarak bir şey yapmama gerek kalmadı çünkü VS 2019 default olarak C# 7 desteğiyle ve .net 4.8 versiyon desteğiyle geliyor.

C#7 ile gelen “Tuple” tipinden faydalanmak isteyenler VS2015 ve Vs2017'de bu özellikleri kullanabilmek için “nuget” aracılığıyla “System.ValuTuple” paketini indirmek zorunda.

Sonuç

C# 7 dili ile gelen ve benim günlük hayatta sıkça kullandığım “Tuple” özelliğinden bahsetmeye çalıştım. Özellikle yeni gelen yapı ile okunabilirlik avantajının ciddi bir fark yarattığını ve “Tuple” tipini çok daha kullanışlı hale getirdiğini düşünüyorum.

Zaman ayırıp okuduğunuz için teşekkür ederim. Yazıyı beğendiyseniz alkışlamayı ve paylaşmayı unutmayın:) Varsa yorumlarınız ve geri bildirimleriniz benim için çok faydalı olacaktır. Fikir alışverişi yapabilmek için bu platform üzerinden(medium) veya twitter üzerinden beni takip edebilirsiniz.

--

--