Поделиться через


Операторы и выражения C#

C# предоставляет ряд операторов. Многие из них поддерживаются встроенными типами и позволяют выполнять основные операции со значениями этих типов. Эти операторы включают следующие группы:

Как правило, можно перегрузить эти операторы, то есть указать поведение оператора для операндов определяемого пользователем типа.

Простейшие выражения C# — это литералы (например, целочисленные и реальные числа) и имена переменных. Их можно объединить в сложные выражения с помощью операторов. Приоритет оператора и ассоциативность определяют порядок выполнения операций в выражении. Скобок можно использовать для изменения порядка оценки, введенного приоритетом оператора и ассоциативностью.

В следующем коде примеры выражений находятся в правой части назначений:

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

Как правило, выражение создает результат и может быть включено в другое выражение. void Вызов метода является примером выражения, которое не создает результат. Его можно использовать только в качестве инструкции, как показано в следующем примере:

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

Ниже приведены некоторые другие виды выражений, которые предоставляет C#:

  • Интерполированные строковые выражения , обеспечивающие удобный синтаксис для создания форматированных строк:

    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.
    
  • Лямбда-выражения , позволяющие создавать анонимные функции:

    int[] numbers = { 2, 3, 4, 5 };
    var maximumSquare = numbers.Max(x => x * x);
    Console.WriteLine(maximumSquare);
    // Output:
    // 25
    
  • Выражения запросов , позволяющие использовать возможности запросов непосредственно в 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
    

Определение текста выражения можно использовать для предоставления краткого определения метода, конструктора, свойства, индексатора или средства завершения.

Приоритет оператора

В выражении с несколькими операторами операторы с более высоким приоритетом оцениваются перед операторами с более низким приоритетом. В следующем примере умножение выполняется сначала, так как оно имеет более высокий приоритет, чем добавление:

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

Используйте круглые скобки для изменения порядка оценки, введенного приоритетом оператора:

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

В следующей таблице перечислены операторы C#, начиная с самого высокого приоритета до самого низкого. Операторы в каждой строке имеют одинаковый приоритет.

Операторы Категория или имя
x.y, f(x), a[i], x?.y, x?[y]x++, x-, x-, x!, new, typeof, checked, unchecked, default, nameof, делегат, sizeof, stackalloc, x-y> Первичный
+x, -x, !x, ~x, ++x, --x, ^x, ^x, (T)x, &x, *x, true и false Унарный
x.y Диапазон
switch, с выражения switch и with
x * y, x / y, x % y Мультипликативный
x + y, x – y Добавка
x << y, x >> y, x >>> y Сдвиг
x < y, x y, x ><= y, x >= y, is, as Реляционное и типопроверочное тестирование
x == y, x != y Равенство
x & y Логический логический И или побитовый логический И
x ^ y Логический XOR или побитовая логическая XOR
x | y Логический илипобитовый логический ИЛИ
х && у Условный И
х || у Условное ИЛИ
x ?? и Оператор объединения null
c ? t : f Условный оператор
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, => Назначение и лямбда-объявление

Сведения о приоритете комбинаторов логических шаблонов см. в разделе "Приоритет и порядок проверки логических шаблонов " статьи "Шаблоны ".

Ассоциативность оператора

Если операторы имеют одинаковый приоритет, ассоциативность операторов определяет порядок выполнения операций:

  • Операторы левого ассоциативного анализа оцениваются слева направо. За исключением операторов назначения и операторов объединения null, все двоичные операторы являются левыми ассоциативными. Например, a + b - c вычисляется как (a + b) - c.
  • Операторы справа направо оцениваются в порядке от справа налево. Операторы назначения, операторы объединения null, лямбда-выражения и условный оператор ?: являются правильными ассоциативными. Например, x = y = z вычисляется как x = (y = z).

Это важно

В выражении формы P?.A0?.A1, если P это nullне так, ни A0A1 вычисляется. Аналогичным образом, в выражении формы P?.A0.A1, так как A0 не вычисляется, если P значение null, ни одно из этих значений не является A0.A1. Дополнительные сведения см. в спецификации языка C# .

Используйте круглые скобки для изменения порядка оценки, введенного оператором ассоциативности:

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

Оценка Операнда

Не связано с приоритетом оператора и ассоциативностью, операнды в выражении вычисляются слева направо. В следующих примерах показано порядок оценки операторов и операндов:

Выражение Порядок вычислений
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, *

Как правило, вычисляются все операнды операторов. Однако некоторые операторы оценивают операнды условно. То есть значение самого левого операнда такого оператора определяет, следует ли оценивать другие операнды (или какие) другие операнды. Эти операторы представляют собой условные логические операторы AND () и OR||(&&), операторы ?? объединения NULL, ??=а также операторы?., допускающие значение NULL, и ?[]условный оператор?:. Дополнительные сведения см. в описании каждого оператора.

Спецификация языка C#

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:

См. также