Positional pattern mencocokkan object berdasarkan hasil method Deconstruct: setiap posisi diuji dengan polanya sendiri. Record posisional menyediakan Deconstruct secara otomatis, sedangkan class biasa bisa menuliskannya sendiri. Pola ini pas untuk data yang identitasnya berupa kumpulan nilai berurutan, seperti koordinat atau klasifikasi berbasis beberapa angka sekaligus.
Mekanisme Deconstruct #
Bentuk pola (pola1, pola2, pola3) memanggil Deconstruct lalu menguji setiap posisi dengan constant, relational, type, atau var. Tanda _ menampung posisi yang tidak ditepati, dan var x mengikat posisi tersebut ke variabel. Clause when hanya tersedia pada arm switch; pada operator is, syarat tambahan ditulis dengan && setelah pola.
Contoh: Klasifikasi Pesanan dan Titik #
public record Pesanan(string Nomor, int Total, bool AnggotaVip);
public class Titik
{
public Titik(int x, int y) => (X, Y) = (x, y);
public int X { get; }
public int Y { get; }
public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}
string Klasifikasikan(Pesanan pesanan) => pesanan switch
{
("ORD-0001", _, _) => "Pesanan uji internal",
(_, >= 1000000, _) => "Pesanan prioritas",
(_, >= 500000, true) => "VIP besar",
(_, > 0, true) => "VIP reguler",
(_, > 0, false) => "Reguler",
_ => "Data tidak valid"
};
Console.WriteLine(Klasifikasikan(new Pesanan("ORD-7001", 650000, true)));
Console.WriteLine(Klasifikasikan(new Pesanan("ORD-7002", 120000, false)));
Console.WriteLine(Klasifikasikan(new Pesanan("ORD-0001", 50000, false)));
Titik titik = new Titik(7, 2);
if (titik is (var x, var y) && x + y == 9)
{
Console.WriteLine($"Jumlah koordinat 9: ({x}, {y})");
}Output yang Dihasilkan:
VIP besar
Reguler
Pesanan uji internal
Jumlah koordinat 9: (7, 2)Mari kita bedah baris demi baris:
record Pesanan(...): Record posisional otomatis memilikiDeconstruct, sehingga pola tiga posisi bisa langsung dipakai tanpa kode tambahan.("ORD-0001", _, _): Posisi pertama diuji constant pattern, sedangkan dua posisi lain ditampung_karena tidak relevan untuk aturan ini.(_, >= 500000, true): Posisi kedua memakai relational pattern dan posisi ketiga constant patterntrue, sehingga syarat gabungan terbaca satu baris.class TitikdenganDeconstruct(out int x, out int y): Class biasa ikut serta dengan menulis sendiri methodDeconstructyang menyalurkanXdanY.titik is (var x, var y) && x + y == 9: Kedua koordinat terikat sekaligus, lalu syarat tambahan diperiksa lewat&&karenawhentidak tersedia padais.
Urutan Arm dan Keutuhan #
Sama seperti pola lain, arm pertama yang cocok menang, sehingga aturan khusus seperti nomor uji internal diletakkan paling atas. Arm discard terakhir menampung data yang tidak valid, misalnya total nol, agar switch expression tetap menjangkau seluruh kemungkinan.