Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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];
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
не так, ни A0
A1
вычисляется. Аналогичным образом, в выражении формы 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#:
См. также
- Перегрузка оператора
- деревья выражений