?: operator —ternary operator warunkowy
Operator ?:
warunkowy , znany również jako operator warunkowyternary, oblicza wyrażenie warunkowe i zwraca wynik jednego z dwóch wyrażeń, w zależności od tego, czy wyrażenie warunkowe daje wartość true
lub false
, jak pokazano w poniższym przykładzie:
string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!";
Console.WriteLine(GetWeatherDisplay(15)); // output: Cold.
Console.WriteLine(GetWeatherDisplay(27)); // output: Perfect!
Jak pokazano w poprzednim przykładzie, składnia operatora warunkowego jest następująca:
condition ? consequent : alternative
Wyrażenie condition
musi mieć wartość lub true
false
. Jeśli condition
wartość zostanie obliczona na true
wartość , consequent
wyrażenie zostanie obliczone, a jego wynik stanie się wynikiem operacji. Jeśli condition
wartość zostanie obliczona na false
wartość , alternative
wyrażenie zostanie obliczone, a jego wynik stanie się wynikiem operacji. Tylko consequent
lub alternative
jest obliczany. Wyrażenia warunkowe są typizowane jako docelowe. Oznacza to, że jeśli znany jest typ docelowy wyrażenia warunkowego, typy consequent
i alternative
muszą być niejawnie konwertowane na typ docelowy, jak pokazano w poniższym przykładzie:
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 };
Jeśli typ docelowy wyrażenia warunkowego jest nieznany (na przykład w przypadku używania var
słowa kluczowego) lub typu consequent
i alternative
musi być taki sam lub musi istnieć niejawna konwersja z jednego typu na drugi:
var rand = new Random();
var condition = rand.NextDouble() > 0.5;
var x = condition ? 12 : (int?)null;
Operator warunkowy jest prawo asocjacyjny, czyli wyrażenie formularza
a ? b : c ? d : e
jest obliczany jako
a ? b : (c ? d : e)
Napiwek
Możesz użyć następującego urządzenia mnemonic, aby pamiętać, jak operator warunkowy jest oceniany:
is this condition true ? yes : no
Warunkowe wyrażenie ref
Warunkowe wyrażenie ref zwraca odwołanie do zmiennej, jak pokazano w poniższym przykładzie:
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
Możesz przypisać wynik warunkowego wyrażenia ref, użyć go jako odwołania zwrotnego lub przekazać ref
go jako ref
parametr metody , , out
lub in
ref readonly
. Możesz również przypisać do wyniku wyrażenia warunkowego ref, jak pokazano w poprzednim przykładzie.
Składnia wyrażenia warunkowego ref jest następująca:
condition ? ref consequent : ref alternative
Podobnie jak operator warunkowy, wyrażenie warunkowe ref oblicza tylko jedno z dwóch wyrażeń: consequent
lub alternative
.
W wyrażeniu warunkowym ref typ consequent
i alternative
musi być taki sam. Wyrażenia warunkowe odwołania nie są typizowane przez obiekt docelowy.
Operator warunkowy i if
instrukcja
Użycie operatora warunkowego zamiast if
instrukcji może spowodować bardziej zwięzły kod w przypadkach, gdy konieczne jest warunkowe obliczenie wartości. W poniższym przykładzie pokazano dwa sposoby klasyfikowania liczby całkowitej jako ujemnej lub nienazwańczej:
int input = new Random().Next(-5, 5);
string classify;
if (input >= 0)
{
classify = "nonnegative";
}
else
{
classify = "negative";
}
classify = (input >= 0) ? "nonnegative" : "negative";
Przeciążenie operatora
Typ zdefiniowany przez użytkownika nie może przeciążyć operatora warunkowego.
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz sekcję Operator warunkowy specyfikacji języka C#.
Specyfikacje nowszych funkcji to: