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

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 menetapkan hasil ekspresi ref bersyarah, menggunakannya sebagai pengembalian referensi atau meneruskannya sebagai refparameter metode , , inout, atau ref readonly.ref 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

Penggunaan operator kondisional alih-alih pernyataan if dapat menghasilkan kode yang lebih ringkas dalam kasus saat Anda secara kondisional perlu menjalankan komputasi nilai. 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