10 Dakikadan Az Sürede C#'ta Tuples'a Giriş
[[academy-video-youtube({"vid": "QC6hpl2iU0c", "start_time": "0", "title": "C#'da Tuples'a Giriş 10 Dakikadan Daha Az Sürede", "creator": "Tim Corey", "length": "9m 49s"})]]
C# yöntemleri tek bir dönüş değerine göre tasarlanmış olup, bir dönüşün gerçekten yeterli olmadığı bir durumla karşılaştığında işler. Adres doğrulama klasik bir örnektir: girişin geçerli olup olmadığını bilmeniz gerekir ve öyleyse, temizlenmiş kanonik formunu geri istemek istersiniz. Bu çifti yepyeni bir sınıfa sarmak, bir yöntem için ağır hissettirir ve out parametreleri, girdiyi ve çıktıyı kötü bir şekilde karıştırır. Demek ki bu tür durumlar için dile daha temiz bir cevap eklenmiştir.
Tim Corey "10 Dakikada ya da Daha Az Sürede C# İçindeki Tuplar ile Tanışma" adlı videosunda, hem biçimlendirilmiş bir dize hem de geçerlilik bayrağı döndürmesi gereken küçük bir adres doğrulama yöntemi oluşturarak bir demet yapı üzerinden çalışır. Yolda, bir demet döndürmek için sözdizimini, neden üyelerin adlandırılmasının önemli olduğunu, sonucun çağrı noktasında ayrı değişkenlere nasıl bölüneceğini ve önemsemediğiniz kısımları boş karakterle nasıl atlayacağınızı kapsar. Hâlâ bir kerelik sonuç sınıflarına veya out parametrelerine yönelen okuyucular, burada daha hafif bir model bulacaklar.
Problem: Birden Fazla Değer Döndürmek
[0:18 - 2:50] Tim, bir sokak adresi dizesi kabul eden bir ValidateAddress yöntemiyle açılış yapıyor. İstediği davranış açık: eğer giriş "123 Sesame St" ile eşleşirse, düzgün biçimlendirilmiş "123 Sesame Street" döndürülür; aksine, adresin geçersiz olduğunu bildirir. Tek bir çağrıdan geri alınması gereken iki bilgi parçası, temizlenmiş dize ve başarı bayrağıdır.
Demet öncesi seçenekler her ikisi de gariptir. ValidateAddressResult sınıfı oluşturmak işe yarar, ancak projede başka hiçbir kodun asla başlatmayacağı tek amaçlı bir tür bırakır. Biçimlendirilmiş adresi parametre listesinden geri göndermek için bir out parametresi kullanmak da işe yarar, ancak method imzasında girdiyi ve çıktıyı karıştırır ve çağrı noktasını okumayı zorlaştırır. Bu maliyetlerin hiçbirini ödemeden bu durumu ele almak için demetler getirildi.
Adlandırılmamış Bir Tuples Döndürmek
[2:50 - 4:01] Minimum bir demet dönüş türü sözdizimi, iki türü parantez içerisine alır:
public (string, bool) ValidateAddress(string address)
{
if (address == "123 Sesame St")
{
return ("123 Sesame Street", true);
}
return (address, false);
}public (string, bool) ValidateAddress(string address)
{
if (address == "123 Sesame St")
{
return ("123 Sesame Street", true);
}
return (address, false);
}Yöntem artık bir (string, bool) çifti döndürüyor. Bir şey kullanmaya çalıştığında ortaya çıkıyor dezavantaj. Üyelere isim atanmadığında, IntelliSense bunları Item1 ve Item2 olarak ortaya çıkarır, bu da bir sonraki okuyucuya her bir değerin neyi temsil ettiğini söylemez. Tim, sözdizimi en kısa olmasına rağmen isimsiz tupları asla göndermemesinin nedenini bu durum olarak işaretliyor. Altı ay sonra result.Item2 okumak, bir kere isim yazmanın maliyetinden daha yüksektir.
Demet Üyelerini Adlandırmak
[4:01 - 6:30] Demet üyelerinin her birine isim atamak, dönüş türü tanımına tek satırlık bir değişikliktir:
public (string Address, bool IsValid) ValidateAddress(string address)
{
if (address == "123 Sesame St")
{
return ("123 Sesame Street", true);
}
return (address, false);
}public (string Address, bool IsValid) ValidateAddress(string address)
{
if (address == "123 Sesame St")
{
return ("123 Sesame Street", true);
}
return (address, false);
}Şimdi çağrı noktası doğaldan okunur:
var result = ValidateAddress("123 Sesame St");
if (result.IsValid)
{
Console.WriteLine($"Your validated address is {result.Address}");
}
else
{
Console.WriteLine("That is an invalid address");
}var result = ValidateAddress("123 Sesame St");
if (result.IsValid)
{
Console.WriteLine($"Your validated address is {result.Address}");
}
else
{
Console.WriteLine("That is an invalid address");
}"123 Sesame St" ile kodu çalıştırmak kanonik formu yazdırır. Önde gelen 1'i kaldırarak "23 Sesame St" üretmek IsValid olarak geri dönüyor ve geçersiz-adres mesajını yazdırıyor. Yöntemin sözleşmesi artık bir adlandırılmış demet'in destekleyici bir sınıf dosyası gerektirmeden çağrı noktasında kendinden belgelidir.
Bir demet ikiden fazla üye taşıyabilir. Üç, dört veya beş, aynı şekilde çalışır. Tim, bir demet üç veya dört üyeden fazla büyüdüğünde, bir kayıt veya sınıfın genellikle daha net bir seçim haline geldiğine, ancak tek bir metoddan iki veya üç ilgili değer için demetin daha hafif bir seçenek olarak kaldığına dikkat çeker.
Demetleri Ayrı Değişkenlere Ayırmak
[6:30 - 7:39] Bazen çağıran, sonucunun her parçasını kendi değişkeninde tutmak ister, tek bir result içinde nokta kullanmak yerine. C# bunu doğrudan ayrım sözdizimi ile destekler:
(string message, bool valid) = ValidateAddress("123 Sesame St");
if (valid)
{
Console.WriteLine($"Your validated address is {message}");
}(string message, bool valid) = ValidateAddress("123 Sesame St");
if (valid)
{
Console.WriteLine($"Your validated address is {message}");
}Sol taraftaki değişken adlarının demet üye adlarıyla eşleşmesi gerekmez. Burada message, Address yerine geçiyor ve valid, IsValid yerine geçiyor. Tim bunun bir deconstructor olduğunu, bir destructor olmadığını belirtir; iki kelime benzer sesler çıkarır, ancak tamamen farklı kavramlara işaret eder. Deconstructor, çağırıcının gerçekten istediği yerel değişkenlere demeti böler.
Boş Karakter ile Değerleri Atlamak
[7:41 - 8:54] Çağıran yalnızca döndürülen değerlerin bir alt kümesiyle ilgilendiğinde, atma karakteri (_) ihtiyaç duymadıkları olanları kaldırır:
(string message, _) = ValidateAddress("123 Sesame St");
Console.WriteLine(message);(string message, _) = ValidateAddress("123 Sesame St");
Console.WriteLine(message);Alt çizgi derleyiciye "Bu değeri bilerek yok sayıyorum." der. Bu, istenmeyen bir üyeyi kullanılmayan gibi bir değişken adına atamaktan daha anlamlıdır, çünkü bir atlama niyeti ifade eder. Satırı okuyan herhangi biri, IsValid yoksaymanın bu çağrı yeri için kasıtlı bir tercih olduğunu, bir ihmal olmadığını bilir.
Özet: Tuplar Ne Zaman Yerini Bulur
[8:54 - 9:28] Tuplar, bir sınıf yaratmadan bir yöntemden birden fazla değer döndürmek için birincil kullanım durumudur. Üyeleri metot imzasında adlandırmak, çağrı noktasında ayrıştırmak ve çağırıcıya gerekli olmayanları gözden çıkarmak, tupların baştaki yaşanabilirlik kalıplarıdır. Bunun ötesinde, tuplar LINQ projeksiyonları ve ara hesaplamalar gibi hızlı eşleme değerlerinin deşifre edilmesi için gösterilebilir.
Sonuç
[9:28 - 9:49] Tuplar, C#'a bir yöntemden birden fazla değeri geri döndürmenin çeşitli bir yolunu sağlar. Adlandırılmış form, günlük olarak kullanmaya değer olan sürümdür, çünkü result.Address okunabilirken result.Item1 okunamaz. Deconstruction, çağırıcı tercih ettiğinde parçaları tekrar yerel değişkenlere terfi ettirir ve boş karakter, tek bir çağrının yalnızca ihtiyaç duyduğu şeyi almasına izin verir.
Örnek İpucu: Aynı tupl şekli üç veya daha fazla yerde deconstruct etmeye başladığınızda, bu bir kayıt için mezuniyet işaretidir. Tupların parlak olduğu noktalar, şeklin tek bir metoda ait olduğu yerlerdir; şeklin alanınızın bir parçası haline geldiği andan itibaren, adlandırılmış bir tip kendi kendini karşılar.
Tam videoyu YouTube Kanalında izleyin ve modern, etkileyici C# yazmaya dair daha fazla bilgi edinin 10 Dakikalık Eğitim serisinde.

