Çözümleme ifadesi - Bir demet veya kullanıcı tanımlı başka bir türden alanların özelliklerini ayıklama

yapısızlaştırma ifadesi bir nesnenin örneğinden veri alanlarını ayıklar. Her ayrık veri öğesi, aşağıdaki örnekte gösterildiği gibi ayrı bir değişkene yazılır:

var tuple = (X: 1, Y: 2);
var (x, y) = tuple;

Console.WriteLine(x); // output: 1
Console.WriteLine(y); // output: 2

Yukarıdaki kod parçacığı, iki tamsayı değeri ve Xolan bir Y oluşturur. İkinci deyim, tanımlama grubu öğesinin yapısını değiştirir ve tanımlama grubu öğelerini ve değişkenlerinde depolar xy.

C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.

Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.

Tavsiye

Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.

Bileşen çözümleme

Tüm tuple türleri parçalama ifadelerini destekler. Demet çözme, demetin tüm öğelerini çıkarır. Tanımlama grubu öğelerinin yalnızca bir kısmını istiyorsanız, aşağıdaki örnekte gösterildiği gibi kullanılmayan tanımlama grubu üyeleri için bir atma kullanın:

var tuple2 = (X: 0, Y: 1, Label: "The origin");
var (x2, _, _) = tuple2;

Önceki örnekte, Y ve label üyeleri atılır. Aynı parçalama ifadesinde birden çok ihmal belirtebilirsiniz. Tanımlama grubunun tüm üyeleri için atmaları kullanabilirsiniz. Aşağıdaki örnek, yararlı olmasa da yasaldır:

var (_, _, _) = tuple2;

Kayıt yapısı kaldırma

birincil oluşturucuya sahip kayıt türleri konumsal parametreler için yapısızlaştırmayı destekler. Derleyici, birincil oluşturucudaki konumsal parametrelerden sentezlenen özellikleri ayıklayan bir Deconstruct yöntemi sentezler. Derleyici tarafından sentezlenen Deconstruct yöntemi, kayıt türünde özellik olarak bildirilen özellikleri ayıklamaz.

Aşağıdaki kodda gösterilen record, iki konumsal özellik olan SquareFeet ve Addressile başka bir özellik olan RealtorNotes'ü bildirir.

public record House(int SquareFeet, string Address)
{
    public required string RealtorNotes { get; set; }
}

Bir House nesnesinin yapısını kaldırdığınızda, aşağıdaki örnekte gösterildiği gibi tüm konumsal özellikler ve yalnızca konumsal özellikler yapısızlaştırılır:

var house = new House(1000, "123 Coder St.")
{
    RealtorNotes = """
    This is a great starter home, with a separate room that's a great home office setup.
    """
};

var (squareFeet, address) = house;
Console.WriteLine(squareFeet); // output: 1000
Console.WriteLine(address); // output: 123 Coder St.
Console.WriteLine(house.RealtorNotes);

Kayıt türlerinizin hangi özelliklerinin derleyici tarafından sentezlenen Deconstruct yönteminin parçası olduğunu belirtmek için bu davranışı kullanabilirsiniz.

Deconstruct yöntemlerini bildirme

Bildirdiğiniz herhangi bir sınıfa, yapıya veya arabirime yapısızlaştırma desteği ekleyebilirsiniz. Türünüzde veya bu türdeki uzantı olarak bir veya daha fazla Deconstruct yöntem bildirin. Yapısızlaştırma ifadesi, bir yöntemi void Deconstruct(out var p1, ..., out var pn)çağırır. Deconstruct yöntemi bir örnek yöntemi veya uzantı yöntemi olabilir. Deconstruct yöntemindeki her parametrenin türü, yapısızlaştırma ifadesindeki karşılık gelen bağımsız değişkenin türüyle eşleşmelidir. Yapısızlaştırma ifadesi, her bağımsız değişkenin değerini out yöntemindeki karşılık gelen Deconstruct parametresinin değerine atar. Birden çok Deconstruct yöntemi yapısızlaştırma ifadesiyle eşleşiyorsa, derleyici belirsizlik için bir hata bildirir.

Aşağıdaki kod, iki Point3D yöntemi olan bir Deconstruct yapısı bildirir:

public struct Point3D
{
    public int X { get; set; }
    public int Y { get; set; }
    public int Z { get; set; }

    public void Deconstruct(out int x, out int y, out int z)
    {
        x = X;
        y = Y;
        z = Z;
    }

    public void Deconstruct(out int x, out int y)
    {
        x = X;
        y = Y;
    }
}

İlk yöntem, üç eksen değerinin tümünü ayıklayan yapısızlaştırma ifadelerini destekler: X, Yve Z. İkinci yöntem yalnızca planar değerlerinin ayrıştırılmasını destekler: X ve Y. İlk yöntemde 3'ün arity vardır; İkincisi 2'lik bir arity'ye sahiptir.

Yukarıdaki bölümde, birincil oluşturucuya sahip Deconstruct türleri için derleyici tarafından sentezlenen record yöntemi açıklanmıştır. Kayıt türlerinde daha fazla Deconstruct yöntemi bildirebilirsiniz. Bu yöntemler başka özellikler ekleyebilir, varsayılan özelliklerden bazılarını veya her ikisini birden kaldırabilir. Ayrıca derleyici tarafından sentezlenen imzayla eşleşen bir Deconstruct bildirebilirsiniz. Böyle bir Deconstruct yöntemi bildirirseniz, derleyici böyle bir yöntemi oluşturmaz.

Derleyici, bir yapısızlaştırma ifadesi için tek bir benzersiz Deconstruct yöntemi belirleyebildiği sürece birden çok Deconstruct yöntemine izin verilir. Genellikle, aynı tür için birden çok Deconstruct yöntemi farklı sayıda parametreye sahiptir. Parametre türlerine göre farklılık gösteren birden çok Deconstruct yöntemi de oluşturabilirsiniz. Ancak çoğu durumda çok fazla Deconstruct yöntemi belirsizlik hatalarına ve yanıltıcı sonuçlara yol açabilir.

C# dil belirtimi

Daha fazla bilgi için C# Standart'in yapı çözümleme bölümüne bakın.

Ayrıca bkz.