Apa yang dimaksud dengan "adalah {}"?

36

Saya melihat kode berikut kadang-kadang, dan tidak tahu apa ekspresi yang sebenarnya diuji.

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}
evan
sumber

Jawaban:

28

Itu hanya pola properti kosong di C # 8, artinya nilainya tidak null. Ini cocok dengan semua tipe nilai atau tipe referensi. Seperti yang dicatat oleh Panagiotis Kanavos di komentar, ini setara dengan value is objectcek lama yang baik yang telah di C # untuk waktu yang lama.

Umumnya jika Anda menentukan properti, maka itu akan cocok atau tidak. Contoh esoterik ini menggambarkan bahwa:

if (value is { Length: 2 })
{
   // matches any object that isn't `null` and has a property set to a length of 2
}

Pola properti bekerja paling baik dan paling jelas ketika membandingkan dengan pola lain dalam kasus seperti switchekspresi.

Daniel A. White
sumber
1
apa artinya benda kosong dalam hal ini? string kosong, ruang putih?
OlegI
3
@OlegI tidak, tidak. ssecara definitelly bukan nol. is {}adalah singkatan is objectdan string dapat dilemparkan ke objek.
Panagiotis Kanavos
6
@OlegI bagaimana bisa begitu? itu referensi yang valid sehingga cocok.
Daniel A. White
3
Its sebuah dunia baru di mana struct dapat null dan referensi tidak dapat null, laporan beralih dibalik dan berbagai !, !!, ?dan ??sebelum dan sesudah sifat berarti hal yang berbeda. Kapan gula sintaksis menjadi mutakhir?
ja72
3
Apakah sama dengan value != null?
ca9163d9
7

Sementara jawaban Daniel benar, saya pikir mungkin berguna untuk menambahkan beberapa konteks tentang mengapa Anda dapat melihat pola properti kosong yang digunakan. Pertimbangkan contoh metode pengontrol ini yang perlu dilakukan validasi:

public async Task<IActionResult> Update(string id, ...) 
{
    if (ValidateId(id) is { } invalid)
        return invalid;
    ...
}

Di atas, ValidateId()dapat mengembalikan nol atau turunan dari BadObjectRequestResult. Jika yang pertama dikembalikan, validasi berhasil dan pindah ke seluruh tubuh Update. Jika yang terakhir dikembalikan, is {}itu benar (yaitu tentu saja contoh BadObjectRequestResultadalah object), dan validasi gagal.

Baik, dari sini kami juga memberikan nama variabel invalid, yang dapat segera kami kembalikan. Tanpa itu kita perlu kode verbose sedikit lebih.

public async Task<IActionResult> Update(string id, ...) 
{
    var invalid = ValidateId(id);
    if (invalid != null)
        return invalid;
    ...
}

Apakah satu lebih mudah dibaca atau yang lain terserah pembaca, saya baru saja disajikan satu cara pola properti kosong dapat digunakan.

Kit
sumber
Dalam hal ini yang harus digunakan is object invalid, bukanis {} invalid
Panagiotis Kanavos
1
@PanagiotisKanavos yang tidak akan berfungsi dalam kasus ini karena pengembalian IActionResultdiperlukan (baik secara teknis Task<IActionResult>). Jika kami menggunakan style Anda, ifhasilnya sama tetapi invalidakan objectjadi ini tidak akan dikompilasi.
Kit
0

Saya pikir ini untuk memeriksa apakah nilainya adalah objek kosong

Nehemie
sumber