Sdílet prostřednictvím


Operátory a výrazy v C#

Jazyk C# poskytuje řadu operátorů. Mnohé z nich jsou podporovány integrovanými typy a umožňují provádět základní operace s hodnotami těchto typů. Mezi tyto operátory patří následující skupiny:

Obvykle můžete přetížit tyto operátory, tj. určit chování operátoru pro operandy uživatelem definovaného typu.

Nejjednodušší výrazy jazyka C# jsou literály (například celé číslo a reálná čísla) a názvy proměnných. Pomocí operátorů je můžete zkombinovat do složitých výrazů. Priorita operátoru a asociativita určují pořadí, ve kterém se operace ve výrazu provádějí. Pomocí závorek můžete změnit pořadí vyhodnocení uložené podle priority operátoru a asociativity.

V následujícím kódu jsou příklady výrazů na pravé straně přiřazení:

int a, b, c;
a = 7;
b = a;
c = b++;
b = a + b * c;
c = a >= 100 ? b : c / 10;
a = (int)Math.Sqrt(b * b + c * c);

string s = "String literal";
char l = s[s.Length - 1];

List<int> numbers = [..collection];
b = numbers.FindLast(n => n > 1);

Výraz obvykle vytvoří výsledek a může být zahrnut do jiného výrazu. Volání void metody je příkladem výrazu, který nevygeneruje výsledek. Dá se použít jenom jako příkaz, jak ukazuje následující příklad:

Console.WriteLine("Hello, world!");

Tady jsou některé další druhy výrazů, které jazyk C# poskytuje:

  • Interpolované řetězcové výrazy , které poskytují pohodlnou syntaxi pro vytváření formátovaných řetězců:

    var r = 2.3;
    var message = $"The area of a circle with radius {r} is {Math.PI * r * r:F3}.";
    Console.WriteLine(message);
    // Output:
    // The area of a circle with radius 2.3 is 16.619.
    
  • Výrazy lambda , které umožňují vytvářet anonymní funkce:

    int[] numbers = { 2, 3, 4, 5 };
    var maximumSquare = numbers.Max(x => x * x);
    Console.WriteLine(maximumSquare);
    // Output:
    // 25
    
  • Výrazy dotazů , které umožňují používat možnosti dotazů přímo v jazyce C#:

    int[] scores = { 90, 97, 78, 68, 85 };
    IEnumerable<int> highScoresQuery =
        from score in scores
        where score > 80
        orderby score descending
        select score;
    Console.WriteLine(string.Join(" ", highScoresQuery));
    // Output:
    // 97 90 85
    

Definici těla výrazu můžete použít k poskytnutí stručné definice metody, konstruktoru, vlastnosti, indexeru nebo finalizátoru.

Priorita operátorů

Ve výrazu s více operátory se operátory s vyšší prioritou vyhodnocují před operátory s nižší prioritou. V následujícím příkladu se násobení provede jako první, protože má vyšší prioritu než sčítání:

var a = 2 + 2 * 2;
Console.WriteLine(a); //  output: 6

Pomocí závorek můžete změnit pořadí vyhodnocení uložené podle priority operátoru:

var a = (2 + 2) * 2;
Console.WriteLine(a); //  output: 8

Následující tabulka uvádí operátory jazyka C# začínající nejvyšší prioritou na nejnižší. Operátory v každém řádku mají stejnou prioritu.

Operátoři Kategorie nebo název
x.y, f(x), a[i], x?.y, , x?[y]x++, x--, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x-y> Primární
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &x, *x, true a false Unární
x..y Rozmezí
s přepínačems výrazy switch a with
x * y, x / y, x % y Multiplikativní
x + y, x – y Aditivní
x << y, x >> y, x >>> y Směna
x < y, x > y, x <= y, x >= y, is, as Relační a typové testování
x == y, x != y Rovnost
x & y Logický logický operátor AND nebo bitový logický operátor AND
x ^ y Logický logický XOR nebo bitový logický XOR
x | y Logická logická hodnota OR nebo bitový logický operátor OR
x & y Podmíněný operátor AND
x || y Podmíněné OR
x ?? y Operátor nulového sjednocení
c ? t : f Podmíněný operátor
x = y, x += y, x -= y, x *= y, x /= y, x %= y, x &= y, x |= y, x ^= y, x <<= y, x = y, x >>= y, x = y, x >>>?? = y, => Deklarace přiřazení a lambda

Informace o prioritě kombinátorů logických vzorů naleznete v části Priorita a pořadí kontroly logických vzorů v článku Vzory .

Asociativita operátoru

Pokud mají operátory stejnou prioritu, asociativita operátorů určuje pořadí, ve kterém se operace provádějí:

  • Asociativní operátory zleva doprava se vyhodnocují v pořadí. S výjimkou operátorů přiřazení a operátorů nulového spojování jsou všechny binární operátory asociativní. Například a + b - c se vyhodnotí jako (a + b) - c.
  • Operátory asociativní zprava se vyhodnocují v pořadí zprava doleva. Operátory přiřazení, operátory nulového sjednocení, lambda a podmíněný operátor ?: jsou asociativní. Například x = y = z se vyhodnotí jako x = (y = z).

Důležité

Ve výrazu formuláře P?.A0?.A1, pokud P je null, ani A0A1 nejsou vyhodnoceny. Podobně ve výrazu formuláře P?.A0.A1, protože A0 není vyhodnocen, pokud P je null, ani není A0.A1. Další podrobnosti najdete ve specifikaci jazyka C# .

Pomocí závorek změňte pořadí vyhodnocení uložené operátorem asociativity:

int a = 13 / 5 / 2;
int b = 13 / (5 / 2);
Console.WriteLine($"a = {a}, b = {b}");  // output: a = 1, b = 6

Vyhodnocení operandu

Nesouvisející s prioritou operátorů a asociativitou se operandy ve výrazu vyhodnocují zleva doprava. Následující příklady ukazují pořadí, ve kterém se vyhodnocují operátory a operandy:

Výraz Pořadí vyhodnocování
a + b a, b, +
a + b * c a, b, c, *, +
a / b + c * d a, b, /, c, d, *, +
a / (b + c) * d a, b, c, +, /, d, *

Obvykle se vyhodnocují všechny operandy operátoru. Některé operátory však vyhodnocují operandy podmíněně. To znamená, že hodnota levého operandu takového operátoru definuje, zda (nebo které) jiné operandy mají být vyhodnoceny. Tyto operátory jsou podmíněné logické operátory AND () a OR (&&||),operátory ?? null-coalescing a ??=, operátory s podmínkou ?. null a ?[]a podmíněný operátor ?:. Další informace najdete v popisu jednotlivých operátorů.

Specifikace jazyka C#

Další informace najdete v následujících částech specifikace jazyka C#:

Viz také