Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
İpucu
Bu makale, en az bir programlama dili bilen ve C# dilini öğrenen geliştiriciler için Temel Bilgiler bölümünün bir parçasıdır. Desenler sizin için yeniyse desen eşleştirmeye genel bakış ile başlayın.
Ayrıştırma, bir değerin tek tek parçalarını (bileşenleri) tek bir işlemde birden çok değişkene atar. Bir demetin bileşenleri, konumlarına göre erişilen öğeleridir. Başka bir tür, bir Deconstruct yöntem tanımlayarak bileşenleri kullanıma açabilir. Özelliklerini oluşturucu benzeri parametreler olarak bildiren konumsal kayıtlar, Deconstruct yöntemini otomatik olarak alır.
Demetleri parçalama
Bir yöntemin şehir verileriyle bir demet döndürdüğü varsayılsın. Her bileşeni birer birer okuyabilirsiniz:
var cityData = QueryCityData("New York City");
var city = cityData.City;
var population = cityData.Population;
var area = cityData.Area;
Bir deconstruction, bu bileşenleri tek adımda atar:
(string city, int population, double area) = QueryCityData("New York City");
C# dilinin değişken türlerini çıkarsamasına da izin verebilirsiniz:
var (city, population, area) = QueryCityData("New York City");
Bir deconstruction, mevcut değişkenleri, yeni bildirilen değişkenleri ve yok sayılanları tek bir atamada karıştırabilir:
(city, var population, _) = QueryCityData("New York City");
Kodun okunmasını kolaylaştıran formu seçin. Parantezlerden önce yer alan tek var, çoğu zaman en açık çıkarımlı biçimdir. Ayrıca, açık türleri ve var parantezlerin içinde de karıştırabilirsiniz, ancak bu biçimi gözden geçirmek genellikle daha zordur. Yalnızca bazı değerlere ihtiyacınız varsa, konumları atlamak yerine yok saymaları kullanın.
Gereksiz değerleri discard ile yoksayın
Üretilen her değer, atamanın sol tarafındaki bir konumla hizalanmalıdır. Bir veya daha fazla konuma ihtiyacınız olmadığında, _ öğesini yok sayma amacıyla kullanın:
var (_, _, population1960, _, population2010) = QueryPopulationDataForYears(
"New York City", 1960, 2010);
Burada demet şehir adını, iki yılı ve iki popülasyon değerini döndürür. Hesaplama yalnızca bu bileşenleri kullandığından, ayrıştırma yalnızca popülasyon değerlerini korur.
Kullanıcı tanımlı türlerin ayrıştırılması
Bir sınıf, yapı veya arabirim, bir Deconstruct metodu bildirerek deconstruction özelliğini destekleyebilir. Her bileşen, yöntemin bir değeri onu döndürmeden çağıranın değişkenine geri atamasını sağlayan bir out parametreye dönüşür. Her bileşen bir out parametre aracılığıyla döndürüldüğünden, yöntemin kendisi döndürür void:
public void Deconstruct(out string firstName, out string middleName, out string lastName)
{
firstName = FirstName;
middleName = MiddleName;
lastName = LastName;
}
Ardından bir örneğin yapısını doğrudan açabilirsiniz:
var (firstName, middleName, lastName) = passenger;
Bir tür, farklı parametre sayılarına sahip birden çok out aşırı yükleme sağlayabilir — yöntemin bildirdiği Deconstruct parametrelerinin sayısı — böylece çağıranlar kaç bileşenin alınacağını seçebilir:
public void Deconstruct(out string firstName, out string lastName)
{
firstName = FirstName;
lastName = LastName;
}
public void Deconstruct(out string firstName, out string middleName, out string lastName)
{
firstName = FirstName;
middleName = MiddleName;
lastName = LastName;
}
public void Deconstruct(out string firstName, out string lastName, out string city, out string state)
{
firstName = FirstName;
lastName = LastName;
city = City;
state = State;
}
Aynı sayıda out parametreye sahip iki aşırı yükleme belirsizdir. Derleyici belirsiz çağrı için bir hata bildirir, bu nedenle aşırı yüklemeleri yalnızca parametre türlerine göre değil, argüman sayısına göre de ayırt edin.
Göz ardı etme, kullanıcı tanımlı yapısökümlemede de çalışır. Atmalar hakkında genel olarak daha fazla bilgi için bkz. Atmalar ve atma deseni:
var (firstName, _, city, _) = passenger;
Kayıtları ayrıştırma
Bir konumsal record veya record struct bir oluşturucuya benzer şekilde özelliklerini tür bildiriminin kendisinde parametre olarak bildirir. Derleyici, sizin için bu konumsal parametrelerle eşleşen Deconstruct parametrelerine sahip bir out yöntemi oluşturur:
var (city, highTempC, lowTempC) = forecast;
Yalnızca konumsal parametreler bu oluşturulan deconstruct işlemine katılır. Kaydın başka bir yerinde bildirdiğiniz ek özellikler otomatik olarak eklenmez.
Sahip olmadığınız türleri ayrıştırma
Bir türü değiştiremiyorsanız, sahip olmadığınız bir türe, o türün bir üyesiymiş gibi, Deconstruct olan bir statik yöntem ekleyerek deconstruct etmeyi yine de destekleyebilirsiniz. Yöntemi ekledikten sonra, herhangi bir Uri değeri yapı bozma ayrıştırma söz dizimini kullanabilir:
static class UriExtensions
{
public static void Deconstruct(this Uri uri, out string scheme, out string host, out int port)
{
scheme = uri.Scheme;
host = uri.Host;
port = uri.Port;
}
}
Burada aynı belirsizlik kuralı geçerlidir: aynı parametre sayısına sahip iki uzantı Deconstruct yöntemi belirsizdir. Bir örnek Deconstruct yöntemi ile aynı ariteye sahip bir uzantı yöntemi arasında belirsizlik de ortaya çıkabilir. Her iki durumda da, derleyici belirsiz çağrı için bir hata bildirir.
Sistem türleri için yerleşik deconstruction
Bazı sistem türleri, kendi türleriniz için kullandığınız mekanizmayı kullanarak zaten bir Deconstruct yöntem tanımlar. Örneğin, System.Collections.Generic.KeyValuePair<TKey,TValue> sözlük yinelemesini kısa hale getiren deconstruction özelliğini destekler:
foreach (var (repo, commitCount) in repoCommitCounts)
{
Console.WriteLine($"{repo} had {commitCount:N0} commits in this snapshot.");
}
Ayrıştırma ve desen eşleştirme
Yöntem Deconstruct , bu tür için konumsal desenleri de etkinleştirir. Konumsal desen, bir değeri bir yapıbozumla aynı parantezli söz dizimini kullanarak bir adımda test eder ve yapıbozuma uğratır: person is ("Alice", 30) yapıbozuma uğratılmış bileşenleri bu değerlere eşit olan bir Person değerle eşleşir. Bu, örneğin gibi adlandırılmış özellikleri doğrudan test eden bir person is { Name: "Alice", Age: 30 }'den farklıdır. Üye adları testi açıkladığı için özellik desenleri genellikle nesne şekilleri için daha nettir. Konumsal desenler, sıra zaten anlamı taşıyorsa, örneğin demetler veya diğer küçük sıralı değerlerde, en güçlü olanlardır.