İlkay İlknur

just a developer...

.NET Framework 4.0 - Tuple Sınıfı

Merhaba,

Blogumun ilk teknik yazısında .NET Framework 4.0 ile beraber gelecek olan Tuple sınıfını inceliyor olacağız. Tuple kavramı aslında F# programlama dili içerisinde kullanılan bir kavram. Bizlere tek bir tip içerisinde birden fazla farklı tipteki verileri saklama olanağı sağlamakta. Baktığımız zaman aslında bizlere bu kavram çok ta yabancı gelmemekte. Biz zaten C# 3.0 ile gelen anonymous type'ları kullanarak tek bir tip içerisinde birden fazla tipteki veriyi saklayabiliyoruz. Ancak anonymous tiplerin kullanımlarında birtakım kısıtlamalar bulunmakta. Bunlardan da yazının sonunda bahsediyor olacağım. Smile

Öncelikle örneklere geçmeden önce Tuple sınıfının yapısına bir göz atalım.

 

Gördüğümüz System isim uzayı içerisinde 8 adet çeşitli generic tipler alan Tuple sınıfları bulunmakta. Her bir nesne yaratıldığı sırada aldığı tipteki değerleri içerisinde taşımakta. Tuple sınıfına baktığımızda maksimum 8 adet veri taşıyabildiğimizi görüyoruz. Ancak dikkatlice bakarsak T7 tipinden sonraki tip adı T8 değil de TRest olarak isimlendirilmiş. Biz bu parametreye eğer bir Tuple nesnesi verirsek aslında bu tip sayısının limitini kolayca arttırabiliriz.

Bir Tuple nesnesini yaratmak için ise çeşitli alternatif yollar bulunmakta.

1- new ile yeni bir Tuple nesnesi oluşturma  Tuple nesnesini oluşturmak için Tuple sınıfını yazdıktan sonra generic parametrelere ihtiyacımız olan tipleri belirttikten sonra yapıcı metot içerisinde ilk değer atamalarını yapabiliriz.
var data = new Tuple<int, string>(2, "ilkay");
var data1 = new Tuple<double, int, string>(12.3, 34, "Tuple Denemesi");
2- Create static metodunu kullanarak Tuple nesnesi oluşturma İkinci alternatif yolumuz ise Tuple sınıfı içerisinde bulunan Create adındaki static metodu kullanmak. Aslında kullanımının yukarıdaki kullanımdan hiçbir farkı bulunmamakta. Sadece burada ihtiyacımız olan tipleri Create adındaki generic metotta belirtmekteyiz.
var data = Tuple.Create<int, string>(2, "ilkay");
var data1 = Tuple.Create<double, int, string>(12.3, 34, "Tuple Denemesi");
Tuple nesnemizi başarıyla yarattık. Şimdi gelelim yarattığımız değerlere nasıl ulaşacağımıza. Aslında nesne içerisindeki üyelere baktığımızda zaten üye adları bize oldukça yardımcı olmakta.   Üyelere baktığımızda Item ile başlayan propertyler karşımıza çıkmakta. Bu propertylerin tipleri Tuple nesnesi yaratırken belirttiğimiz tipleri ve değerleri taşımakta. Yazımın başında Tuple nesnesinin en fazla 8 adet veri taşıyabileceğinden ve 8. parametrenin tipinin TRest olarak adlandırıldığından bahsetmiştim. TRest parametresini kullanarak son tipe eğer yeni bir Tuple nesnesi eklersek bu 8 parametre sınırını rahatça ortadan kaldırabiliriz. Örneğin, var data = new Tuple<int, int, int, int, int, int, int, Tuple<int, int, int>>(1, 2, 3, 4, 5, 6, 7, Tuple.Create<int, int, int>(8, 9, 10));
Console.WriteLine(data.Rest.Item3);
Yukarıdaki örnekte 10 elemanlı bir Tuple nesnesi elde etmekteyiz. 7. elemandan sonraki elemanlara ise Rest referansı kullanarak ulaşmaktayız. Örnekte 10. eleman ekrana yazdırılmaktadır. Gelelim Tuple sınıfını nerelerde kullanabileceğimize. Anonymous tiplerin bir takım kısıtlamaları olduğundan bahsetmiştim. Bunlardan biri anonymous tiplerin metotlara parametre olarak geçirilememesi. Ancak Tuple sınıfı kullanılarak bu kısıtlamanın önüne geçerek parametre olarak Tuple sınıfını geçirebiliriz. Böylece anonymous tiplerde gerçekleştirmek istediğimiz fonksiyonaliteyi gerçekleştirmiş olmaktayız. Bir diğer kısıt ise yine anonymous tiplerin metotlardan geri dönüş tipi olarak ta kullanılamaması. Bu sefer yine dönüş tipi olarak Tuple sınıfını kullandığımızda metottan birden fazla değer döndürebilmekteyiz (out parametreleri kullanmadan). Son olarak bahsedeceğim kullanım alanı ise zorunlu olarak tek bir parametre alan metotlar. Bunlara örnek vermek gerekirse parametre alan Thread metotları sadece tek bir object parametresi almak zorunda. Ancak birden fazla parametre vermek istediğimizde Tuple sınıfını akıllıca ve hızlı bir şekilde kullanabiliriz.
static void Main(string[] args)
{
        var data = new Tuple<int, int>(2, 3);
        ParameterizedThreadStart start = new ParameterizedThreadStart(ThreadTest);
        Thread thread = new Thread(start);
        thread.Start(data);
}
static void ThreadTest(object obj)
{
        Tuple<int, int> data = obj as Tuple<int, int>;
        Console.WriteLine("Item1 : {0} \nItem2 : {1}", data.Item1, data.Item2);
        Console.ReadLine();
}
Tuple sınıfını yukarıdaki şekilde kullanarak 2 adet integer tipindeki parametreyi metodumuza kolayca geçirebilmekteyiz. Tuple sınıfının generic parametrelerini dynamic olarak belirleyerek çok daha esnek bir şekilde ve farklı senaryolarla bu sınıfı kullanabiliriz. .NET Framework 4.0 ile beraber gelecek olan Tuple sınıfı incelememizin sonuna geldik. Herkese iyi akşamlar


Yorum Gönder