?: operátor – a ternáris feltételes operátor
A feltételes operátor ?:
( más néven ternáris feltételes operátor) kiértékel egy logikai kifejezést, és a két kifejezés egyikének eredményét adja vissza attól függően, hogy a logikai kifejezés kiértékeli-e true
vagy false
azt, ahogyan az alábbi példa mutatja:
string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!";
Console.WriteLine(GetWeatherDisplay(15)); // output: Cold.
Console.WriteLine(GetWeatherDisplay(27)); // output: Perfect!
Ahogy az előző példa is mutatja, a feltételes operátor szintaxisa a következő:
condition ? consequent : alternative
A condition
kifejezésnek ki kell értékelnie a következőt: true
vagy false
. Ha condition
kiértékeli a true
kifejezést, a consequent
rendszer kiértékeli a kifejezést, és az eredmény a művelet eredménye lesz. Ha condition
kiértékeli a false
kifejezést, a alternative
rendszer kiértékeli a kifejezést, és az eredmény a művelet eredménye lesz. Csak consequent
vagy alternative
kiértékelve. A feltételes kifejezések cél típusúak. Vagyis ha egy feltételes kifejezés céltípusa ismert, a céltípusnak consequent
alternative
implicit módon konvertálhatónak kell lennie a céltípusra, ahogyan az alábbi példa is mutatja:
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 };
Ha egy feltételes kifejezés céltípusa ismeretlen (például a kulcsszó használatakor var
) vagy a típusának consequent
, és alternative
azonosnak kell lennie, vagy implicit konverziónak kell lennie az egyik típusról a másikra:
var rand = new Random();
var condition = rand.NextDouble() > 0.5;
var x = condition ? 12 : (int?)null;
A feltételes operátor jobb asszociatív, vagyis az űrlap kifejezése
a ? b : c ? d : e
kiértékelése a következőképpen történik:
a ? b : (c ? d : e)
Tipp.
A feltételes operátor kiértékelésének módját a következő mnemonikus eszköz használatával jegyezheti fel:
is this condition true ? yes : no
Feltételes újraf kifejezés
A feltételes újraf kifejezés feltételesen egy változóhivatkozást ad vissza, ahogy az alábbi példa is mutatja:
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
Hozzárendelheti egy feltételes ref-kifejezés eredményét, használhatja hivatkozási visszatérésként, vagy átadhatjaref
azt , out
, , in
vagy ref readonly
metódusparaméterként.ref
A feltételes újraf kifejezés eredményéhez is hozzárendelhető, ahogy az előző példa is mutatja.
A feltételes újraf kifejezés szintaxisa a következő:
condition ? ref consequent : ref alternative
A feltételes operátorhoz hasonlóan a feltételes ref kifejezés is csak az egyiket értékeli ki a két kifejezés közül: vagy alternative
.consequent
A feltételes újraf kifejezésben a típusnak meg kell egyeznie, és alternative
meg kell egyeznieconsequent
. A feltételes újraf kifejezések nem cél típusúak.
Feltételes operátor és utasítás if
A feltételes operátor utasítás helyett if
való használata tömörebb kódot eredményezhet abban az esetben, ha feltételesen ki kell számítania egy értéket. Az alábbi példa két módszert mutat be egy egész szám negatív vagy nem nemegatív besorolására:
int input = new Random().Next(-5, 5);
string classify;
if (input >= 0)
{
classify = "nonnegative";
}
else
{
classify = "negative";
}
classify = (input >= 0) ? "nonnegative" : "negative";
Operátorok túlterhelése
A felhasználó által definiált típus nem terhelheti túl a feltételes operátort.
C# nyelvspecifikáció
További információ: A C# nyelvi specifikációjának feltételes operátor szakasza.
Az újabb funkciók specifikációi a következők:
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: