C# 7’de Gelmesi Muhtemel Yeni TUPLES Özellikleri
Selamlar,
Bugün C# 7’de TUPLES sınıfına, gelmesi muhtemel yeni özellikleri inceleyeceğiz. Yani şu an var olan “Tuple” sınıfının eksiklerini tamalama amaçlı düşünülen bu gelişmeleri örnekler ile inceleyeceğiz.
İsterseniz gelin önce şu an var olan Tuple sınıfını bir hatırlayalım:
Tuple istenen sayıda ve istenen tipde veri tutan bir yapıdır. Parametre sayısı olarak Max 8 gözükse de parametre değeri olarak yeni bir Tuple verildiğinde, değişken sayısı nerede ise sınırsıza ulaşmaktadır:) Esas amaç, farklı data tipindeki çoklu veriyi, sınıf oluşturmadan istendiğinde döndürebilmektir. Namespace’i System.Tuple‘dır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class TupleData { static void Main() { // 3 farklı değer tutan tuple yaratılır. Tuple<int, string, bool> tuple= new Tuple<int, string, bool>(1978, "Bora Kasmer", true); // Tuple değerlerine erişilir. if (tuple.Item1 < 1980) { Console.WriteLine("Yaşınız: " + (2016 - tuple.Item1).ToString()); } if (tuple.Item2 == "Bora Kasmer") { Console.WriteLine("Hoş Geldi: "+tuple.Item2); } if (tuple.Item3) { Console.WriteLine(tuple.Item3); } Console.ReadLine(); } } |
Yukarıdaki örnekte görüldüğü gibi 3 farklı tipte değişken Tuple içerisine yazılmış ve okunmuştur.
Tuple.Create() method : Tuple nesnesi oluşturmak için “Tuple.Create()” static methodu kullanılabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Tuple.Create static method. var tuple = Tuple.Create("borakasmer.com", 100, true); // string değeri. string value = tuple.Item1; if (value == "borakasmer.com") { Console.WriteLine(true); } // Test Item2 and Item3. Console.WriteLine(tuple.Item2 == 100); Console.WriteLine(!tuple.Item3); // tuple'in kendi değeri yazılır. Console.WriteLine(tuple); Console.ReadLine(); |
Yukarıdaki örnekde görüldüğü gibi ilgili Create() static methodu ile değişkenler “Tuple”‘a atanmış ve herbir değişken çeklip belli koşullar içinde kullanılmıştır. Uygulamanın çıktısı aşağıdaki gibidir.
Çoklu Değer Döndürme: Methodlar çoklu değer döndürmek için “Tuple”‘ı kullanabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
static Tuple<string, int> ProductAndPrice() { //Bu method çoklu değer döndürür. return new Tuple<string, double>("XboxOne", 1200); } static void Main(string[] args) { var result = ProductAndPrice(); string product= result.Item1; double price= result.Item2; // Çoklu sonuç döndürülür. Console.WriteLine(product); Console.WriteLine(price); } |
Tuple’ın Avantajları:
- Kaç tane parametre taşısa da tekil bir nesnedir.
- Erişimi kolaydır.
- Bir method “out” paramteresi almadan birden fazla değer döndürebilir.
Tuple’ın Dezavantajları:
Tuple’ın en kötü yanı bünyesindeki eleman isimleridir. “Item1″,”Item2” şeklinde erişmek, kodun anlaşılırlığı açısından hiçte iyi değildir. “Tuple”‘ın geri dönüş değeri, geliştirici için pek de anlam ifade etmemektedir. Bu da okunurluğu düşürmekte ve code’un sonradan tekrardan geliştirilmesini engellemektedir.
İşte tam bu noktada ya bir methodun dönüş tipi Tuple’a benzer bir yapı haline getirilirse:
C# 7 ile Olması Muhtemel Tuple Yeniliği – 1: Aşağıda tüm ürünler gezilerek toplam sayısı ve ödenecek toplam ürün fiyatı geri dönülmektedir.
1 2 3 4 5 6 |
public(double totalPrice,int count) Tally(IEnumerable<T> products) { var s=0; var c=0; foreach (var product in products) { s+= product.price; c++; } return (s,c); } |
Methodun Geri dönüşünü yakalamak için 2 farklı muhtemel yol tasarlanmıştır: Ben ilkini daha çok beyendim. Geri dönüş tipi bir çeşit sınıf gibi çalışıyor. 2. yöntemde, belirtilen herbir değişkene atamalar yapılmaktadır. Ama zaman ne göstericek ben de bilmiyorum.
1 2 3 4 5 6 |
//1. Olasılık var t = Tally(allProducts); Console.WriteLine($"Toplam: {t.totalPrice}, Adet: {t.count}"); //2. Olasılık (var s,var c) = Tally(allProducts); Console.WriteLine($"Toplam: {s}, Adet: {c}"); |
Tuples Ve Async: İstenir ise “Tuple” asenkron olarak da result şeklinde dönülebilecektir. Örnek kod aşağıdaki gibi değiştirilmiştir. Böylece toplam ürün masrafı ve kaç adet ürün alındığı ekrana yazdırılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 |
public async Task<(double totalPrice,int count)> TallyAsync(IAsyncEnumerable <T> products)where T : Product { var s=0; var c=0; foreach (await var product in products){ s+= product.price; c++; } return (s,c); } var t = await Tally(allProducts); Console.WriteLine($"Toplam: {t.totalPrice}, Adet: {t.count}"); (var s,var c) = await Tally(allProducts); Console.WriteLine($"Toplam: {s}, Adet: {c}"); |
Geldik bir makalenin daha sonuna. Bu makalede C #7 ile “Tuple” sınıfı için muhtmel gelebilecek yeniklere göz attık. Umarım hepsi gelir. Böylece anlaşılır kod yazma adına çok da tercih etmediği “Tuple” artık benim de favorim olabilir:)
Yeni bir makalede görüşmek üzere hoşçakalın.
buralar değerlenir #rez