Megosztás:


?: 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 falseazt, 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 C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.

A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.

Tipp.

Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.

A condition kifejezésnek ki kell értékelnie a következőt: true vagy false. Ha condition kiértékeli a truekifejezé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 falsekifejezé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 consequentalternative 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

A feltételes újraf kifejezés eredményét hozzárendelhetiref. Használja hivatkozásként, vagy adja át , out, , invagy ref readonlymetódusparaméterkéntref. 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 consequent.alternative

A feltételes újraf kifejezésben a típusnak meg kell egyeznie, és consequent meg kell egyezniealternative. 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, 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