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,Item2gibi 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#Yaş: 25
İsim: Ahmet
Aktif mi?: TrueC#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,Item2gibi 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ü
classolduğ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?
structtabanlı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ş, aktifgibi 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#Yaş: 30
İsim: Mehmet
Aktif mi?: TrueC#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#İsim: Fatma
Yaş: 28C#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ı
| Özellik | Tuple<T1, T2, …> | ValueTuple<T1, T2, …> |
|---|---|---|
| Bellek Kullanımı | Heap (Yavaş) | Stack (Hızlı) |
| Değiştirilebilirlik | Değiştirilemez (Immutable) | Değiştirilebilir (Mutable) |
| Performans | Daha yavaş | Daha hızlı |
| Maksimum Eleman Sayısı | 8 | Sınırsız |
| Kullanım Kolaylığı | Item1, Item2 gibi isimler | Anlamlı isimlerle tanımlanabilir |
| Okunabilirlik | Daha az okunaklı | Daha okunaklı |
4. Kullanım Alanları
| Senaryo | Tuple Kullanımı | ValueTuple Kullanımı |
|---|---|---|
| Geçici Veri Saklama | Kullanılabilir | Daha iyi bir tercih |
| Metottan Birden Fazla Değer Döndürme | Kullanılabilir | Daha iyi bir tercih |
| Performans Gerektiren İşlemler | Tavsiye edilmez | Tercih edilmelidir |
| Veri Taşıma (DTO yerine geçici çözümler) | Kullanılabilir | Kullanılabilir |
| Kısa Ömürlü Veriler | Kullanılabilir | Daha iyi bir tercih |