Bagikan melalui


?: operator - operator bersyarat ternary

Operator kondisional ?:, yang juga dikenal sebagai operator kondisional tiga bagian, mengevaluasi ekspresi Boolean dan mengembalikan hasil salah satu dari dua ekspresi, tergantung pada apakah ekspresi Boolean mengevaluasi ke true atau false, seperti yang ditunjukkan dalam contoh berikut:

string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!";

Console.WriteLine(GetWeatherDisplay(15));  // output: Cold.
Console.WriteLine(GetWeatherDisplay(27));  // output: Perfect!

Seperti yang ditunjukkan contoh sebelumnya, sintaksis untuk operator kondisional adalah sebagai berikut:

condition ? consequent : alternative

Referensi bahasa C# mendokumentasikan versi bahasa C# yang paling baru dirilis. Ini juga berisi dokumentasi awal untuk fitur dalam pratinjau publik untuk rilis bahasa yang akan datang.

Dokumentasi mengidentifikasi fitur apa pun yang pertama kali diperkenalkan dalam tiga versi terakhir bahasa atau dalam pratinjau publik saat ini.

Tip

Untuk menemukan kapan fitur pertama kali diperkenalkan di C#, lihat artikel tentang riwayat versi bahasa C#.

Ekspresi condition harus mengevaluasi ke true atau false. Jika condition mengevaluasi ke true, ekspresi consequent dievaluasi, dan hasilnya menjadi hasil operasi. Jika condition mengevaluasi ke false, ekspresi alternative dievaluasi, dan hasilnya menjadi hasil operasi. Hanya consequent atau alternative yang dievaluasi. Ekspresi bersyarkat dititik target. Artinya, jika jenis target ungkapan bersyarat diketahui, jenis consequent dan alternative harus secara implisit dapat dikonversi ke jenis target, seperti yang ditunjukkan contoh berikut:

var rand = new Random();
var condition = rand.NextDouble() > 0.5;

int? x = condition ? 12 : null;

IEnumerable<int> xs = x is null ? new List<int>() { 0, 1 } : new int[] { 2, 3 };

Jika jenis target ekspresi kondisional tidak diketahui (misalnya, saat Anda menggunakan var kata kunci) atau jenis consequent dan alternative harus sama atau harus ada konversi implisit dari satu jenis ke jenis lainnya:

var rand = new Random();
var condition = rand.NextDouble() > 0.5;

var x = condition ? 12 : (int?)null;

Operator kondisional bersifat hak-asosiatif, yakni, ekspresi dari bentuk tersebut

a ? b : c ? d : e

dievaluasi sebagai

a ? b : (c ? d : e)

Tip

Anda dapat menggunakan perangkat mnemonik berikut untuk mengingat bagaimana operator kondisional dievaluasi:

is this condition true ? yes : no

Ekspresi ref kondisional

Ekspresi ref kondisional mengembalikan referensi variabel secara kondisional, seperti yang ditunjukkan contoh berikut:

int[] smallArray = {1, 2, 3, 4, 5};
int[] largeArray = {10, 20, 30, 40, 50};

int index = 7;
ref int refValue = ref ((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]);
refValue = 0;

index = 2;
((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]) = 100;

Console.WriteLine(string.Join(" ", smallArray));
Console.WriteLine(string.Join(" ", largeArray));
// Output:
// 1 2 100 4 5
// 10 20 0 40 50

Anda dapat ref menetapkan hasil ekspresi ref bersyarah. Gunakan sebagai pengembalian referensi atau berikan sebagai refparameter metode , , outin, atau ref readonly . Anda juga dapat menetapkan ke hasil ekspresi ref bersyariah, seperti yang ditunjukkan contoh sebelumnya.

Sintaksis untuk ekspresi ref kondisional adalah sebagai berikut:

condition ? ref consequent : ref alternative

Seperti operator kondisional, ekspresi ref kondisional hanya mengevaluasi salah satu dari dua ekspresi: baik consequent atau alternative.

Dalam ekspresi ref bersyarah, jenis consequent dan alternative harus sama. Ekspresi ref kondisional tidak dititik target.

Operator kondisional dan pernyataan if

Menggunakan operator bersyarat alih-alih pernyataan dapat menghasilkan kode yang if lebih ringkas ketika Anda perlu menghitung nilai secara kondisional. Contoh berikut menunjukkan dua cara untuk mengklasifikasikan bilangan bulat sebagai negatif atau nonnegatif:

int input = new Random().Next(-5, 5);

string classify;
if (input >= 0)
{
    classify = "nonnegative";
}
else
{
    classify = "negative";
}

classify = (input >= 0) ? "nonnegative" : "negative";

Kelebihan beban operator

Jenis yang ditentukan pengguna tidak dapat membebani operator bersyarkat.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian Operator kondisional dari Spesifikasi bahasa C#.

Spesifikasi untuk fitur yang lebih baru adalah:

Lihat juga