C# Tuples Nedir?

Tuple, farklı veri tiplerinden bir dizi öğe içeren bir veri yapısıdır. Özellikleri (Property) olan bir nesneyi tutmak için bir veri yapısına sahip olmak istediğiniz, ancak bunun için ayrı bir tür oluşturmak istemediğiniz yerlerde kullanılabilir.

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

Örneğin aşağıdaki örnek, üç öğeli bir tuple oluşturur:

Tuple<int, string, string> person = 
            new Tuple <int, string, string>(1, "Steve", "Jobs");

Yukarıdaki örnekte, bir kişinin kaydını tutan bir Tuple örneği oluşturduk. Her öğe için bir tip belirledik ve yapıcıya (constructor) değerler ilettik. Her bir öğenin tipini belirtmek biraz uğraştırıcı olabilir. Bu nedenle C#, aşağıda gösterildiği gibi her öğenin tipini belirtmeden Tuple<T> örneğini döndüren static bir yardımcı sınıf içerir.

var person = Tuple.Create(1, "Steve", "Jobs");

Bir tuple yalnızca en fazla sekiz öğe içerebilir. Sekizden fazla eleman eklemeye çalıştığınızda derleyici hatası veriyor.

var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, 8);

Tuple Öğelerine Erişim

Bir Tuple öğelerine Item<elementNumber> özellikleriyle erişilebilir, örneğin Item1, Item2, Item3 … Item7 özelliğine kadar. Son öğe (8. öğe), Rest özelliği kullanılarak döndürülür.

var person = Tuple.Create(1, "Steve", "Jobs");
person.Item1; // returns 1
person.Item2; // returns "Steve"
person.Item3; // returns "Jobs"


var numbers = Tuple.Create("One", 2, 3, "Four", 5, "Six", 7, 8);
numbers.Item1; // returns "One"
numbers.Item2; // returns 2
numbers.Item3; // returns 3
numbers.Item4; // returns "Four"
numbers.Item5; // returns 5
numbers.Item6; // returns "Six"
numbers.Item7; // returns 7
numbers.Rest; // returns (8)
numbers.Rest.Item1; // returns 8

Genel olarak 8. konum, Rest özelliğini kullanarak erişebileceğiniz iç içe geçmiş grup öğe içindir.

İç İçe Tuple Kullanımı

Bir Tuple’da sekizden fazla öğe eklemek istiyorsanız, bunu başka bir tuple nesnesini sekizinci öğe olarak ekleyerek yapabilirsiniz. Son iç içe geçmiş kayıt grubuna, Rest özelliği kullanılarak erişilebilir. İç içe Tuple öğesine erişmek için Rest.Item1.Item<elelementNumber> özelliğini kullanın.

var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9, 10, 11, 12, 13));
numbers.Item1; // returns 1
numbers.Item7; // returns 7
numbers.Rest.Item1; //returns (8, 9, 10, 11, 12, 13)
numbers.Rest.Item1.Item1; //returns 8
numbers.Rest.Item1.Item2; //returns 9

İç içe geçmiş tuple nesnesini dizinin herhangi bir yerine dahil edebilirsiniz. Ancak, Rest özelliği kullanılarak erişilebilmesi için iç içe geçmiş tuple’ın dizinin sonuna yerleştirilmesi önerilir.

var numbers = Tuple.Create(1, 2, Tuple.Create(3, 4, 5, 6, 7,  8), 9, 10, 11, 12, 13 );
numbers.Item1; // returns 1
numbers.Item2; // returns 2
numbers.Item3; // returns (3, 4, 5, 6, 7,  8)
numbers.Item3.Item1; // returns 3
numbers.Item4; // returns 9
numbers.Rest.Item1; //returns 13

Metot Parametresi Olarak Tuple Kullanımı

Bir metot, parametre olarak bir tuple’a sahip olabilir.

static void Main(string[] args)
{
            var person = Tuple.Create(1, "Steve", "Jobs");
    DisplayTuple(person);
}

static void DisplayTuple(Tuple<int,string,string> person)
{
    Console.WriteLine($"Id = { person.Item1}");
    Console.WriteLine($"First Name = { person.Item2}");
    Console.WriteLine($"Last Name = { person.Item3}");
}

Dönüş Tipi Olarak (Return Type) Tuple Kullanımı

static void Main(string[] args)
{
            var person = GetPerson();
}

static Tuple<int, string, string> GetPerson() 
{
            return Tuple.Create(1, "Bill", "Gates");
}

Tuple Nerede/Ne Zaman Kullanılır

Tuple aşağıdaki senaryolarda kullanılabilir:

  • ref veya out parametrelerini kullanmadan bir metotdan birden fazla değer döndürmek istediğinizde.
  • Tek bir parametre aracılığıyla bir metoda birden çok değer iletmek istediğinizde.
  • Ayrı bir sınıf oluşturmadan bir veritabanı kaydını veya bazı değerleri geçici olarak tutmak istediğinizde.

Tuple Sınırlamaları

  • Tuple bir referans tipidir ve bir value tipi değildir. Belleğin heap alanı üzerinde tahsis eder ve yoğun CPU işlemlerine neden olabilir.
  • Tuple, sekiz öğe içerecek şekilde sınırlıdır. Daha fazla öğe depolamanız gerekiyorsa, iç içe geçmiş tuple kullanmanız gerekir. Ancak bu durum belirsizliğe neden olabilir.
  • Tuple öğelerine, bir anlam ifade etmeyen Item<elementNumber> ad kalıbına sahip özellikler kullanılarak erişilebilir.

C# 7, Tuple’ın sınırlamalarının üstesinden gelmek için ValueTuple içerir ve Tuple ile çalışmayı daha da kolaylaştırır.

ValueTuple hakkında daha fazla bilgi almak için aşağıda ki makalemi okuyabilirsiniz.

Value Tuple

https://alkanfatih.com/c-value-tuples-nedir/

One comment

Comments are closed.