Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Tip
Artikel ini adalah bagian dari bagian Dasar-Dasar untuk pengembang yang sudah mengetahui setidaknya satu bahasa pemrograman dan mempelajari C#. Mulailah dengan gambaran umum pencocokan pola jika pola baru bagi Anda. Untuk aturan kompatibilitas lengkap, lihat deklarasi dan pola jenis dalam referensi bahasa.
Sebuah pola tipe diterapkan pada ekspresi input. C# mengevaluasi ekspresi, lalu menguji apakah nilai yang dihasilkan non-null dan jenis run-time-nya kompatibel dengan jenis yang ditentukan. Pola jenis hanya melaporkan apakah pengujian jenis berhasil. Ini tidak mendeklarasikan variabel.
Ajukan pertanyaan jenis ya-or-no
Dalam sistem pengiriman, IRouteStop adalah kontrak kapabilitas untuk tujuan yang diterima oleh sistem perencanaan rute.
CanRoute menguji apakah tujuan yang dievaluasi memiliki kemampuan tersebut, dan hasil Boolean-nya menentukan apakah tujuan memasuki alur kerja perencanaan rute. Alur kerja ini hanya membutuhkan jawaban ya atau tidak dan tidak membaca anggota route-stop apa pun, sehingga pola tipe tanpa variabel yang ditangkap cocok.
static bool CanRoute(object? destination) =>
destination is IRouteStop;
Ekspresi input adalah destination, dan IRouteStop merupakan jenis yang sedang diuji. Pilih pola jenis ketika jawabannya hanya ya atau tidak. Jika cabang yang cocok perlu membaca alamat atau memanggil anggota lain melalui IRouteStop, pilih pola deklarasi sebagai gantinya sehingga cabang memiliki variabel jenis tersebut.
Note
Anda mungkin juga melihat destination is IRouteStop _. Sintaksis itu adalah pola deklarasi yang _ berarti bahwa tidak ada variabel yang dipertahankan. Keduanya melakukan jenis pengujian yang sama jika kedua bentuk tersebut valid, tetapi destination is IRouteStop menyatakan maksud bahwa itu hanya untuk pengujian secara lebih langsung.
Mencocokkan kelas dan antarmuka
Dalam sistem pengiriman, IRouteStop mendefinisikan kontrak kemampuan untuk tujuan perencanaan rute, sementara RouteStop merupakan kelas dasar yang menyediakan data dan implementasi penghentian rute umum.
ExpressRouteStop adalah kelas khusus yang berasal dari RouteStop. Contoh menguji satu nilai yang dievaluasi sehingga outputnya dapat menunjukkan ketiga jenis yang kompatibel. Setiap pengujian hanya membutuhkan hasil Boolean, sehingga tidak diperlukan variabel yang diambil.
interface IRouteStop { }
abstract class RouteStop(string street) : IRouteStop
{
public string Street { get; } = street;
public string GetDisplayName() => Street;
}
sealed class ExpressRouteStop(string street) : RouteStop(street)
{
}
static void ShowCompatibility()
{
object destination = new ExpressRouteStop("8 Oak Avenue");
Console.WriteLine($"Exact class: {destination is ExpressRouteStop}");
Console.WriteLine($"Base class: {destination is RouteStop}");
Console.WriteLine($"Interface: {destination is IRouteStop}");
}
Nilai yang dievaluasi adalah sebuah ExpressRouteStop. Output menunjukkan bahwa itu cocok dengan kelas yang sama persis, kelas dasar RouteStop, dan antarmuka IRouteStop yang diimplementasikan oleh RouteStop.
Untuk aturan kompatibilitas terperinci dan kasus tepi, lihat referensi pola jenis.
Rutekan beberapa jenis
Dalam sistem dukungan, SupportRequest adalah kelas dasar untuk kelas permintaan khusus seperti PasswordResetRequest dan BillingQuestion.
Cabang switch mengaitkan sebuah pola dengan hasil yang akan dikembalikan saat pola tersebut cocok. Setiap cabang mengembalikan nama antrean pemrosesan, dan cabang terakhir menyediakan antrean cadangan untuk nilai lain yang dievaluasi. Antrean yang dipilih hanya bergantung pada jenis run-time dari nilai yang dievaluasi, sehingga pola jenis cocok karena tidak ada anggota permintaan yang dibaca.
static string RouteRequest(object request) =>
request switch
{
PasswordResetRequest => "Identity queue",
BillingQuestion => "Billing queue",
SupportRequest => "General support queue",
_ => "Intake queue"
};
Setiap lengan menjawab pertanyaan jenis dan mengembalikan antrean yang menangani permintaan tersebut. Jika lengan perlu membaca anggota permintaan, gunakan pola deklarasi untuk mengambil nilai yang cocok dalam variabel.
Lengan sakelar diurutkan dari atas ke bawah. Letakkan kelas khusus sebelum kelas dasarnya. Jika tidak, lengan kelas dasar dapat mencocokkan setiap instans kelas khusus, yang membuat lengan selanjutnya tidak dapat dijangkau.
Opsional: gunakan parameter jenis sebagai jenis yang diuji
Contoh opsional ini dibangun pada jenis dan metode generik.
Parameter tipe seperti TRequest adalah penanda untuk tipe yang diberikan oleh pemanggil. Batch permintaan masuk dapat berisi beberapa jenis permintaan, dan pemanggil menyediakan ConfidentialRequest untuk menguji apakah ada permintaan yang memerlukan penanganan rahasia. Hasil Boolean memilih penanganan rahasia untuk seluruh batch dan menghasilkan pesan status yang terlihat. Pola jenis dengan parameter jenis cocok karena hanya keberadaan permintaan yang cocok yang penting, sehingga objek yang cocok tidak perlu dipertahankan.
static void ShowConfidentialBatchHandling()
{
object[] incomingRequests = [new BillingQuestion(), new ConfidentialRequest()];
bool requiresConfidentialHandling =
ContainsRequestOfType<ConfidentialRequest>(incomingRequests);
Console.WriteLine(requiresConfidentialHandling
? "Send the entire batch to confidential handling."
: "Send the batch to standard handling.");
}
static bool ContainsRequestOfType<TRequest>(IEnumerable<object> requests)
{
foreach (object request in requests)
{
if (request is TRequest)
{
return true;
}
}
return false;
}
Jika pemanggil membutuhkan permintaan yang cocok itu sendiri, operasi pencarian atau filter yang mengembalikan item yang cocok akan lebih tepat.