Pembuangan dan pola pembuangan

Tip

Artikel ini adalah bagian dari bagian Dasar-Dasar untuk pengembang yang sudah mengetahui setidaknya satu bahasa pemrograman dan mempelajari C#. Jika Anda baru menggunakan pola, mulailah dengan gambaran umum pencocokan pola. Untuk sintaks lengkap, lihat referensi discard pattern.

Token garis bawah (_) mengomunikasikan bahwa nilai tidak diperlukan. Arti yang tepat tergantung pada tempatnya muncul:

Context Arti dari _
Lengan ekspresi pengalih atau pola berlapis Pola buang yang cocok tanpa menangkap hasilnya
Dekonstruksi atau out sebuah argumen Buang yang mengabaikan satu nilai yang dihasilkan
Penugasan seperti _ = expression Penugasan pembuangan yang mengevaluasi ekspresi dan mengabaikan hasilnya
Dua parameter lambda atau lebih bernama _ Buang parameter yang inputnya tidak digunakan
var _ dalam sebuah pola Pola var dengan penanda pengabaian

Formulir ini berbagi ejaan dan niat, tetapi tidak dapat dipertukarkan.

Pencocokan pola dengan switch

Dalam contoh berikut, statusCode adalah int. Setiap lengan sakelar menghasilkan pesan string, yang kemudian ditulis program ke konsol. _ Final menangani setiap kode status selain 200 dan 404:

static void ShowStatus()
{
    int statusCode = 503;
    string message = statusCode switch
    {
        200 => "Ready",
        404 => "Not found",
        _ => "Another status"
    };

    Console.WriteLine(message);
}

Pola pengabaian diterapkan pada ekspresi masukan. C# mengevaluasi ekspresi, dan _ mencocokkan nilai yang dievaluasi tanpa menangkapnya. Pilih _ sebagai cabang terakhir dari ekspresi switch jika setiap nilai yang belum ditangani sebelumnya harus menggunakan alternatif yang sama. Letakkan di urutan terakhir karena cocok dengan apa pun, termasuk null.

Bentuk var _ merupakan pola var dengan penunjukan pengabaian. Ini juga cocok dengan setiap nilai yang dievaluasi, tetapi tidak memperkenalkan variabel yang dapat dibaca. Gunakan pola pengabaian yang lebih singkat _ untuk kasus default pada switch. Untuk informasi selengkapnya tentang var pola dan penunjukan, lihat Deklarasi, konstanta, dan var pola.

Deklarasi dekonstruksi

GetForecast mengembalikan tuple dengan empat komponen: kota string dan tiga int nilai untuk suhu tinggi, suhu rendah, dan peluang hujan. Deklarasi dekonstruksi mempertahankan city dan high karena program menampilkannya. Ini menggunakan _ untuk suhu rendah dan peluang hujan karena penamaan komponen yang tidak digunakan akan menyiratkan bahwa kode membutuhkannya:

static void ShowForecast()
{
    var (city, high, _, _) = GetForecast();
    Console.WriteLine($"{city}: high {high}°C");

    static (string City, int High, int Low, int RainChance) GetForecast() =>
        ("Portland", 18, 9, 40);
}

Sintaks buang yang sama berfungsi saat metode objek Deconstruct menghasilkan beberapa nilai. Untuk bentuk-bentuk tersebut, lihat Mendekonstruksi tuple dan tipe lainnya.

Panggilan ke metode dengan parameter out

Anggap kolom input hanya menerima teks jika teks tersebut merepresentasikan bilangan bulat. Metode TryParse(String, Int32) mengembalikan bool yang melaporkan apakah penguraian berhasil. Ini juga menghasilkan int yang telah diurai melalui parameter out. Kode berikut hanya memerlukan hasil Boolean untuk menerima atau menolak input:

static void CheckInput()
{
    string text = "42";

    if (IsWholeNumber(text))
    {
        Console.WriteLine($"Accepted: {text}");
    }
    else
    {
        Console.WriteLine("Enter a whole number.");
    }

    static bool IsWholeNumber(string text) => int.TryParse(text, out _);
}

Gunakan out _ jika hanya keberhasilan operasi yang penting. Pengabaian nilai tersebut menunjukkan dengan jelas bahwa angka hasil parsing itu tidak diperlukan. Jika nanti kode membutuhkan angka tersebut, beri out nama argumen, seperti out int number, dan pertahankan nilai tersebut sebagai gantinya.

Penetapan pembuangan, _ = expression, mengevaluasi ekspresi lalu sengaja mengabaikan hasilnya. Kadang-kadang ini berguna saat ekspresi tersebut, dalam kondisi lain, bukan merupakan pernyataan yang valid.

Important

Jangan gunakan _ = Task.Run(...) atau _ = SomeAsyncMethod() untuk membuang tugas dalam kode aplikasi. Tunggu tugas sehingga penyelesaian dan pengecualiannya tetap dalam alur panggilan. Penetapan ke variabel buangan tidak membuat tugas menjadi aman, tidak membuat pengecualiannya teramati, maupun menciptakan operasi fire-and-forget yang didukung.

Menandai parameter lambda yang tidak digunakan

Sebuah EventHandler menerima pengirim object? dan nilai EventArgs. Handler berikut tidak memerlukan parameter; itu hanya menulis ke konsol "Timer tick" . Menamai kedua parameter _ membuat status tidak terpakainya terlihat tanpa mengarang nama yang tidak pernah digunakan oleh isi fungsi:

static void ShowLambdaDiscards()
{
    EventHandler handler = (_, _) => Console.WriteLine("Timer tick");
    handler(null, EventArgs.Empty);
}

Pilih parameter pengabaian ketika tanda tangan delegat memerlukan input yang tidak digunakan oleh isi lambda. Jika lambda hanya memiliki satu parameter bernama _, _ tetap menjadi nama parameter biasa untuk kompatibilitas mundur.

Hindari _ sebagai pengidentifikasi

_ dapat menjadi pengidentifikasi biasa dalam konteks di mana C# tidak mengenali pembuangan. Variabel bernama _ yang berada dalam cakupan dapat menerima penugasan yang tampak seperti penugasan discard. Dalam konteks pola, konstanta atau jenis yang dapat diakses bernama _ juga dapat mengubah cara _ ditafsirkan. Hindari mendeklarasikan variabel, konstanta, atau tipe Anda sendiri yang bernama _; gunakan _ untuk menunjukkan maksud pengabaian.

Baca juga