?: 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 ref
parameter metode , , in
out
, 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: