?: operator - de ternaire voorwaardelijke operator
De voorwaardelijke operator, ook wel bekend als de ternaire voorwaardelijke operator ?:
, evalueert een Booleaanse expressie en retourneert het resultaat van een van de twee expressies, afhankelijk van of de Boole-expressie resulteert in true
of false
, zoals in het volgende voorbeeld wordt weergegeven:
string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!";
Console.WriteLine(GetWeatherDisplay(15)); // output: Cold.
Console.WriteLine(GetWeatherDisplay(27)); // output: Perfect!
Zoals in het voorgaande voorbeeld wordt weergegeven, is de syntaxis voor de voorwaardelijke operator als volgt:
condition ? consequent : alternative
De condition
expressie moet worden geëvalueerd of false
true
. Als condition
dit wordt true
geëvalueerd, wordt de consequent
expressie geëvalueerd en wordt het resultaat ervan het resultaat van de bewerking. Als condition
dit wordt false
geëvalueerd, wordt de alternative
expressie geëvalueerd en wordt het resultaat ervan het resultaat van de bewerking. Alleen consequent
of alternative
wordt geëvalueerd. Voorwaardelijke expressies zijn doelgetypeerd. Als een doeltype van een voorwaardelijke expressie bekend is, moeten de typen consequent
en alternative
impliciet worden geconverteerd naar het doeltype, zoals in het volgende voorbeeld wordt weergegeven:
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 };
Als een doeltype van een voorwaardelijke expressie onbekend is (bijvoorbeeld wanneer u het var
trefwoord gebruikt) of het type consequent
en alternative
hetzelfde moet zijn of als er een impliciete conversie van het ene type naar het andere moet zijn:
var rand = new Random();
var condition = rand.NextDouble() > 0.5;
var x = condition ? 12 : (int?)null;
De voorwaardelijke operator is rechts-associatief, dat wil gezegd een expressie van het formulier
a ? b : c ? d : e
wordt geëvalueerd als
a ? b : (c ? d : e)
Tip
U kunt het volgende mnemonic-apparaat gebruiken om te onthouden hoe de voorwaardelijke operator wordt geëvalueerd:
is this condition true ? yes : no
Expressie voor voorwaardelijke verw
Een expressie voor voorwaardelijke verw retourneert voorwaardelijk een variabeleverwijzing, zoals in het volgende voorbeeld wordt weergegeven:
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
U kunt het resultaat van een expressie voor voorwaardelijke verw toewijzen, deze gebruiken als verwijzingsresource of doorgeven als een ref
, out
of ref readonly
in
methodeparameter.ref
U kunt ook toewijzen aan het resultaat van een voorwaardelijke verw-expressie, zoals in het voorgaande voorbeeld wordt weergegeven.
De syntaxis voor een expressie voor voorwaardelijke verw is als volgt:
condition ? ref consequent : ref alternative
Net als bij de voorwaardelijke operator evalueert een expressie voor voorwaardelijke verw slechts één van de twee expressies: ofwel consequent
alternative
.
In een voorwaardelijke verw-expressie moet het type consequent
en alternative
hetzelfde zijn. Expressies voor voorwaardelijke verw zijn niet doelgetypeerd.
Voorwaardelijke operator en een if
instructie
Het gebruik van de voorwaardelijke operator in plaats van een if
instructie kan leiden tot beknoptere code in gevallen waarin u voorwaardelijk een waarde wilt berekenen. In het volgende voorbeeld ziet u twee manieren om een geheel getal als negatief of niet-negatief te classificeren:
int input = new Random().Next(-5, 5);
string classify;
if (input >= 0)
{
classify = "nonnegative";
}
else
{
classify = "negative";
}
classify = (input >= 0) ? "nonnegative" : "negative";
Overbelasting van operatoren
Een door de gebruiker gedefinieerd type kan de voorwaardelijke operator niet overbelasten.
C#-taalspecificatie
Zie de sectie Voorwaardelijke operator van de C#-taalspecificatie voor meer informatie.
Specificaties voor nieuwere functies zijn: