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


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

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

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

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

Подсказка

Чтобы узнать, когда функция впервые появилась в 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#:

См. также