Udostępnij za pomocą


Operatory i wyrażenia języka C#

Język C# udostępnia wiele operatorów. Wiele z nich jest obsługiwanych przez wbudowane typy i umożliwia wykonywanie podstawowych operacji z wartościami tych typów. Te operatory obejmują następujące grupy:

Zazwyczaj można przeciążyć te operatory, czyli określić zachowanie operatora dla operandów typu zdefiniowanego przez użytkownika.

Najprostsze wyrażenia języka C# to literały (na przykład liczby całkowite i liczby rzeczywiste ) oraz nazwy zmiennych. Można je połączyć w złożone wyrażenia przy użyciu operatorów. Pierwszeństwo operatora i asocjalność określają kolejność wykonywania operacji w wyrażeniu. Nawiasy umożliwiają zmianę kolejności oceny nałożonej przez pierwszeństwo operatora i kojarzenie.

W poniższym kodzie przykłady wyrażeń znajdują się po prawej stronie przypisań:

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);

Zazwyczaj wyrażenie generuje wynik i może zostać uwzględnione w innym wyrażeniu. Wywołanie void metody jest przykładem wyrażenia, które nie generuje wyniku. Można go używać tylko jako instrukcji, jak pokazano w poniższym przykładzie:

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

Oto kilka innych rodzajów wyrażeń dostępnych w języku C#:

  • Wyrażenia ciągów interpolowanych , które zapewniają wygodną składnię do tworzenia sformatowanych ciągów:

    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.
    
  • Wyrażenia lambda , które umożliwiają tworzenie funkcji anonimowych:

    int[] numbers = { 2, 3, 4, 5 };
    var maximumSquare = numbers.Max(x => x * x);
    Console.WriteLine(maximumSquare);
    // Output:
    // 25
    
  • Wyrażenia zapytań , które umożliwiają korzystanie z funkcji zapytań bezpośrednio w języku 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
    

Możesz użyć definicji treści wyrażenia , aby podać zwięzłą definicję metody, konstruktora, właściwości, indeksatora lub finalizatora.

Priorytet operatorów

W wyrażeniu z wieloma operatorami operatory o wyższym pierwszeństwie są obliczane przed operatorami o niższym pierwszeństwie. W poniższym przykładzie mnożenie jest wykonywane najpierw, ponieważ ma wyższy priorytet niż dodanie:

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

Użyj nawiasów, aby zmienić kolejność oceny narzuconą przez pierwszeństwo operatora:

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

W poniższej tabeli wymieniono operatory języka C# rozpoczynające się od najwyższego pierwszeństwa do najniższego. Operatory w każdym wierszu mają taki sam pierwszeństwo.

Operatorów Kategoria lub nazwa
x.y, f(x), a[i], x?.y, x?[y]x++, x--, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x-y> Podstawowy
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &x, *x, true i false Jednoargumentowy
x..y Zakres
przełącznik, z wyrażenia switch i with
x * y, x / y, x % y Multiplikatywny
x + y, x – y Dodatek
x << y, x >> y, x >>> y Zmiana
x < y, x > y, x <= y, x >= y, is Testowanie relacyjne i typowe
x == y, x != y Równość
x & y Logiczne i logiczne AND lub bitowe, logiczne AND
x ^ y Logiczne XOR logiczne lub logiczne XOR bitowe
x | y Logiczne OR lub bitowe logiczne OR
x &&y Warunkowe I
x || y Warunkowe LUB
x ?? y Operator łączenia wartości null
c ? t : f Operator warunkowy
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, => Deklaracja przypisania i lambda

Aby uzyskać informacje na temat pierwszeństwa kombinatorów wzorców logicznych, zobacz sekcję Pierwszeństwo i kolejność sprawdzania wzorców logicznych w artykule Patterns (Wzorce ).

Kojarzenie operatorów

Gdy operatory mają taki sam pierwszeństwo, skojarzenie operatorów określa kolejność wykonywania operacji:

  • Operatory kojarzące z lewej strony są oceniane w kolejności od lewej do prawej. Z wyjątkiem operatorów przypisania i operatorów łączenia wartości null wszystkie operatory binarne są skojarzone z lewej strony. Na przykład a + b - c wartość jest obliczana jako (a + b) - c.
  • Operatory kojarzące od prawej do lewej są oceniane w kolejności od prawej do lewej. Operatory przypisania, operatory łączenia wartości null, lambdy i operator ?:warunkowy są prawo asocjacyjne. Na przykład x = y = z wartość jest obliczana jako x = (y = z).

Ważne

W wyrażeniu formularza P?.A0?.A1, jeśli P ma nullwartość , ani nie A1A0 są obliczane. Podobnie, w wyrażeniu formularza P?.A0.A1, ponieważ A0 nie jest obliczany, gdy P ma wartość null, ani .A0.A1 Aby uzyskać więcej informacji, zobacz specyfikację języka C# .

Użyj nawiasów, aby zmienić kolejność oceny narzuconą przez skojarzenie operatora:

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

Ocena operandu

Niezwiązane z pierwszeństwem operatora i kojarzeniem operandy w wyrażeniu są oceniane od lewej do prawej. W poniższych przykładach pokazano kolejność oceniania operatorów i operandów:

Wyrażenie Kolejność obliczania
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, *

Zazwyczaj wszystkie operandy operatorów są oceniane. Jednak niektóre operatory warunkowo oceniają operandy. Oznacza to, że wartość lewego operandu takiego operatora określa, czy (lub które) inne operandy powinny być oceniane. Te operatory to warunkowe operatory logiczne AND () i OR (&&||),operatory ?? łączenia wartości null i operatory warunkowe o wartości null oraz ??=?[]operator warunkowy .?.?: Aby uzyskać więcej informacji, zobacz opis każdego operatora.

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz następujące sekcje specyfikacji języka C#:

Zobacz także