Tuple ve ValueTuple Kullanımı

C# dilinde Tuple ve ValueTuple, birden fazla değeri bir arada saklamak için kullanılan yapılardır. Struct ve sınıflardan (class) farklı olarak, daha hafif ve kullanımı kolaydırlar. Tuple referans tipi (class), ValueTuple ise değer tipi (struct) olarak tanımlanır.

Bu yapıların en büyük avantajı, geçici olarak birden fazla değeri döndürmek veya bir arada saklamak isteyen durumlarda sınıf veya struct tanımlamak yerine hızlı bir çözüm sunmalarıdır.

1. Tuple Kullanımı

1.1. Tuple Nedir?

  • Tuple (Referans Tipi – Class), birden fazla değeri tek bir yapıda saklamayı sağlar.
  • System.Tuple<T1, T2, ...> sınıfı üzerinden tanımlanır.
  • İmmutable (değiştirilemez) bir yapıdır, yani içindeki değerler değiştirilemez.
  • Maksimum 8 eleman içerebilir (Tuple<T1, ..., T8>).
  • Okunabilirliği düşüktür, çünkü Item1, Item2 gibi isimlerle erişilir.

1.2. Tuple Tanımlama ve Kullanımı

Tuple<int, string, bool> kisi = new Tuple<int, string, bool>(25, "Ahmet", true);

// Tuple elemanlarına erişim
Console.WriteLine($"Yaş: {kisi.Item1}");
Console.WriteLine($"İsim: {kisi.Item2}");
Console.WriteLine($"Aktif mi?: {kisi.Item3}");
C#
C#
Yaş: 25
İsim: Ahmet
Aktif mi?: True
C#

Not: Tuple içindeki elemanlara Item1, Item2 gibi erişim sağlanır, bu da kodun okunabilirliğini düşürür.

1.3. Tuple Kullanarak Metottan Birden Fazla Değer Döndürme

Tuple, bir metodun birden fazla değer döndürmesine olanak tanır.

Tuple<string, int> KisiBilgileri()
{
    return new Tuple<string, int>("Mehmet", 30);
}

var kisi = KisiBilgileri();
Console.WriteLine($"İsim: {kisi.Item1}, Yaş: {kisi.Item2}");
C#

1.4. Tuple Kullanmanın Dezavantajları

  • Item1, Item2 gibi anlamsız değişken adları okunabilirliği azaltır.
  • Immutable (değiştirilemez) yapıdadır, yani değerleri değiştiremeyiz.
  • Performans açısından yavaştır, çünkü class olduğu için Heap belleğinde saklanır.

Çözüm: ValueTuple kullanarak daha okunaklı ve performanslı bir yapı oluşturabiliriz.

2. ValueTuple Kullanımı

2.1. ValueTuple Nedir?

  • struct tabanlıdır, yani Heap yerine Stack üzerinde saklanır.
  • Daha hızlıdır ve daha az bellek tüketir.
  • Değiştirilebilir (mutable) yapıdadır.
  • Daha okunaklı bir erişim sağlar (isim, yaş, aktif gibi isimlerle tanımlanabilir).
  • .NET Core 2.0 ve .NET Framework 4.7+ sürümlerinde kullanılabilir.

Not: System.ValueTuple kullanabilmek için System.ValueTuple kütüphanesi yüklü olmalıdır.

2.2. ValueTuple Tanımlama ve Kullanımı

using System;

class Program
{
    static void Main()
    {
        (int yas, string isim, bool aktif) kisi = (30, "Mehmet", true);

        Console.WriteLine($"Yaş: {kisi.yas}");
        Console.WriteLine($"İsim: {kisi.isim}");
        Console.WriteLine($"Aktif mi?: {kisi.aktif}");
    }
}
C#
C#
Yaş: 30
İsim: Mehmet
Aktif mi?: True
C#

Gördüğümüz gibi ValueTuple kullanarak daha okunaklı bir yapı oluşturduk.

2.3. ValueTuple Kullanarak Metottan Birden Fazla Değer Döndürme

Bir metodun birden fazla değer döndürmesini sağlamak için ValueTuple kullanılabilir.

(ValueTuple<string, int>) KisiBilgileri()
{
    return ("Ayşe", 25);
}

var kisi = KisiBilgileri();
Console.WriteLine($"İsim: {kisi.Item1}, Yaş: {kisi.Item2}");
C#

2.4. İsimlendirilmiş ValueTuple Kullanımı

Item1, Item2 yerine anlamlı isimlerle kullanabiliriz.

(string isim, int yas) KisiBilgileri()
{
    return ("Fatma", 28);
}

var kisi = KisiBilgileri();
Console.WriteLine($"İsim: {kisi.isim}, Yaş: {kisi.yas}");
C#
C#
İsim: Fatma
Yaş: 28
C#

2.5. ValueTuple Kullanarak Değer Döndürme ve Destructuring

Bir fonksiyondan dönen ValueTuple değerlerini doğrudan değişkenlere atayabiliriz.

(string isim, int yas, bool aktif) KisiBilgileri()
{
    return ("Burak", 35, false);
}

var (isim, yas, aktif) = KisiBilgileri();

Console.WriteLine($"İsim: {isim}, Yaş: {yas}, Aktif mi?: {aktif}");
C#

Bu yönteme “destructuring” denir ve kodun okunabilirliğini artırır.

3. Tuple ve ValueTuple Karşılaştırması

ÖzellikTuple<T1, T2, …>ValueTuple<T1, T2, …>
Bellek KullanımıHeap (Yavaş)Stack (Hızlı)
DeğiştirilebilirlikDeğiştirilemez (Immutable)Değiştirilebilir (Mutable)
PerformansDaha yavaşDaha hızlı
Maksimum Eleman Sayısı8Sınırsız
Kullanım KolaylığıItem1, Item2 gibi isimlerAnlamlı isimlerle tanımlanabilir
OkunabilirlikDaha az okunaklıDaha okunaklı

4. Kullanım Alanları

SenaryoTuple KullanımıValueTuple Kullanımı
Geçici Veri SaklamaKullanılabilirDaha iyi bir tercih
Metottan Birden Fazla Değer DöndürmeKullanılabilirDaha iyi bir tercih
Performans Gerektiren İşlemlerTavsiye edilmezTercih edilmelidir
Veri Taşıma (DTO yerine geçici çözümler)KullanılabilirKullanılabilir
Kısa Ömürlü VerilerKullanılabilirDaha iyi bir tercih