Операторы и выражения C# (справочник по C#)
C# предоставляет ряд операторов. Многие из них поддерживаются встроенными типами и позволяют выполнять базовые операции со значениями этих типов. В число этих операторов входят следующие группы:
- Арифметические операторы, выполняющие арифметические операции с числовыми операндами.
- Операторы сравнения, сравнивающие числовые операнды.
- Логические операторы, выполняющие логические операции с операндами
bool
. - Битовые операторы и операторы сдвига выполняют битовые операции или операции сдвига с операндами целочисленных типов.
- Операторы равенства проверяют равенство или неравенство своих операндов.
Как правило, можно выполнить перегрузку этих операторов, то есть указать поведение оператора для операндов определяемого пользователем типа.
Простейшими выражениями 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];
var numbers = new List<int>(new[] { 1, 2, 3 });
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#:
var scores = new[] { 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!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x-y> |
Основной |
+x, -x, !x, ~x, ++x, --x, ^x, ^x, (T)x, await, &x, *x, true и false | Унарный |
x..y | Диапазон |
switch, with | Выражения switch и with |
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 |
Логическое исключающее ИЛИ или побитовое логическое исключающее ИЛИ |
x | y |
Логическое ИЛИ или побитовое логическое ИЛИ |
x && y | Условное И |
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, => | Назначение и объявление лямбда-выражений |
Ассоциативность операторов
Если операторы имеют одинаковый приоритет, порядок их выполнения определяется ассоциативностью операторов:
- Операторы с левой ассоциативностью вычисляются слева направо. За исключением операторов присваивания и оператора объединения со значением NULL, все бинарные операторы имеют левую ассоциативность. Например, выражение
a + b - c
вычисляется как(a + b) - c
. - Операторы с правой ассоциативностью вычисляются справа налево. Операторы присваивания, операторы объединения null, лямбда-выражения и условные операторы
?:
являются правильными ассоциативными. Например, выражениеx = y = z
вычисляется какx = (y = z)
.
Используйте скобки, чтобы изменить порядок вычисления, накладываемый ассоциативностью операторов:
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, * |
Как правило, оцениваются все операнды операторов. Однако некоторые операторы оценивают операнды условно. То есть значение крайнего левого операнда такого оператора определяет, следует ли оценивать другие операнды. Эти операторы являются условными логическими операторами И (&&
) и ИЛИ (||
) , операторами объединения со значением NULL??
и ??=
, условными операторами со значением NULL ?.
и ?[]
и условным оператором ?:
. Дополнительные сведения см. в описании каждого оператора.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#: