Операторы C#C# Operators

C# предоставляет множество операторов, которые являются символами, указывающими, какие операции (математические операции, индексирование, вызов функции и т. д.) следует выполнять в выражении.C# provides many operators, which are symbols that specify which operations (math, indexing, function call, etc.) to perform in an expression. Вы можете перегрузить многие операторы, то есть изменить их значение при применении к некоторому пользовательскому типу.You can overload many operators to change their meaning when applied to a user-defined type.

Обычно для перечислений (enum) разрешены все операции, применимые к целочисленным типам (например, ==, !=, <, >, & и |).Operations on integral types (such as ==, !=, <, >, &, |) are generally allowed on enumeration (enum) types.

В следующих разделах перечислены операторы C# в порядке убывания приоритета.The sections below list the C# operators starting with the highest precedence to the lowest. Операторы в каждом разделе совместно используют один и тот же уровень приоритета.The operators within each section share the same precedence level.

Основные операторыPrimary Operators

Это операторы с наивысшим приоритетом.These are the highest precedence operators.

x.y — доступ к членам.x.y – member access.

x?.y — доступ к членам с проверкой NULL.x?.y – null conditional member access. Возвращает значение null, если левый операнд имеет значение null.Returns null if the left-hand operand evaluates to null.

x?[y] — доступ к индексам, определяемый условием NULL.x?[y] - null conditional index access. Возвращает значение null, если левый операнд имеет значение null.Returns null if the left-hand operand evaluates to null.

f(x) — вызов функции.f(x) – function invocation.

a[x] — индексирование агрегатного объекта.a[x] – aggregate object indexing.

x++ — постфиксный инкремент.x++ – postfix increment. Возвращает значение x и затем обновляет расположение хранения значением x, которое увеличено на единицу (обычно добавляется целочисленное значение 1).Returns the value of x and then updates the storage location with the value of x that is one greater (typically adds the integer 1).

x-- — постфиксный декремент.x-- – postfix decrement. Возвращает значение x и затем обновляет расположение хранения значением x, которое уменьшено на единицу (обычно вычитается целочисленное значение 1).Returns the value of x and then updates the storage location with the value of x that is one less (typically subtracts the integer 1).

new – создание экземпляра типа.new – type instantiation.

typeof — возвращает объект Type, представляющий операнд.typeof – returns the Type object representing the operand.

checked — включает проверку на переполнение при выполнении операций с целыми числами.checked – enables overflow checking for integer operations.

unchecked — отключает проверку на переполнение при выполнении операций с целыми числами.unchecked – disables overflow checking for integer operations. Это поведение установлено для компилятора по умолчанию.This is the default compiler behavior.

default(T) — создает значение типа T по умолчанию.default(T) – produces the default value of type T.

delegate — объявляет и возвращает экземпляр делегата.delegate – declares and returns a delegate instance.

sizeof — возвращает размер в байтах для типа операнда.sizeof – returns the size in bytes of the type operand.

-> — разыменование указателя в сочетании с доступом к члену.-> – pointer dereferencing combined with member access.

Унарные операторыUnary Operators

Эти операторы имеют более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.These operators have higher precedence than the next section and lower precedence than the previous section.

+x — возвращает значение x.+x – returns the value of x.

-x — числовое отрицание.-x – numeric negation.

!x — логическое отрицание.!x – logical negation.

~x — поразрядное дополнение.~x – bitwise complement.

++x — префиксный инкремент.++x – prefix increment. Возвращает значение x после обновления расположения хранения значением x, которое увеличено на единицу (обычно добавляется целочисленное значение 1).Returns the value of x after updating the storage location with the value of x that is one greater (typically adds the integer 1).

--x — префиксный декремент.--x – prefix decrement. Возвращает значение x после обновления расположения хранения значением x, которое уменьшено на единицу (обычно вычитается целочисленное значение 1).Returns the value of x after updating the storage location with the value of x that is one less (typically subtracts the integer 1).

(T)x — приведение типов.(T)x – type casting.

awaitTask — ожидание выполнения .await – awaits a Task.

&x — получение адреса.&x – address of.

*x — разыменование.*x – dereferencing.

Мультипликативные операторыMultiplicative Operators

Эти операторы имеют более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.These operators have higher precedence than the next section and lower precedence than the previous section.

x * y — умножение.x * y – multiplication.

x / y — деление.x / y – division. Если операнды имеют целые числа, результатом является целочисленное значение, усеченное в сторону нуля (например, -7 / 2 is -3).If the operands are integers, the result is an integer truncated toward zero (for example, -7 / 2 is -3).

x % y — остаток.x % y – remainder. Если операнды имеют целые числа, это возвращает остаток от деления x на y.If the operands are integers, this returns the remainder of dividing x by y. Если q = x / y и r = x % y, то x = q * y + r.If q = x / y and r = x % y, then x = q * y + r.

Аддитивные операторыAdditive Operators

Эти операторы имеют более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.These operators have higher precedence than the next section and lower precedence than the previous section.

x + y — сложение.x + y – addition.

x – y — вычитание.x – y – subtraction.

Операторы сдвигаShift Operators

Эти операторы имеют более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.These operators have higher precedence than the next section and lower precedence than the previous section.

x << y — сдвиг битов влево и заполнение правого бита нулем.x << y – shift bits left and fill with zero on the right.

x >> y — сдвиг битов вправо.x >> y – shift bits right. Если левым операндом является int или long, затем левые биты заполняются битом знака.If the left operand is int or long, then left bits are filled with the sign bit. Если левым операндом является uint или ulong, затем левые биты заполняются нулем.If the left operand is uint or ulong, then left bits are filled with zero.

Относительные операторы и операторы тестирования типаRelational and Type-testing Operators

Эти операторы имеют более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.These operators have higher precedence than the next section and lower precedence than the previous section.

x < y — меньше чем (возвращает true, если x меньше y).x < y – less than (true if x is less than y).

x > — больше чем (возвращает true, если x больше y).x > y – greater than (true if x is greater than y).

x <= y – меньше или равноx <= y – less than or equal to.

x >= y – больше или равно.x >= y – greater than or equal to.

is — совместимость типов.is – type compatibility. Возвращает значение true, если вычисленный левый операнд может быть приведен к типу, указанному в правом операнде (статический тип).Returns true if the evaluated left operand can be cast to the type specified in the right operand (a static type).

as — преобразование типов.as – type conversion. Возвращает левый операнд, приведенный к типу, заданному правым операндом (статический тип), но as возвращает null, где (T)x вызывает исключение.Returns the left operand cast to the type specified by the right operand (a static type), but as returns null where (T)x would throw an exception.

Операторы равенстваEquality Operators

Эти операторы имеют более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.These operators have higher precedence than the next section and lower precedence than the previous section.

x == y — тождество.x == y – equality. По умолчанию для ссылочных типов, отличных от string, этот оператор возвращает равенство ссылок (проверка удостоверения).By default, for reference types other than string, this returns reference equality (identity test). Однако типы могут перегрузить ==, поэтому если планируется проверять удостоверения, лучше использовать метод ReferenceEquals для object.However, types can overload ==, so if your intent is to test identity, it is best to use the ReferenceEquals method on object.

x != y — неравенство.x != y – not equal. См. примечание для ==.See comment for ==. Если тип перегружает ==, то его необходимо перегрузить !=.If a type overloads ==, then it must overload !=.

Оператор логического ИLogical AND Operator

Этот оператор имеет более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.This operator has higher precedence than the next section and lower precedence than the previous section.

x & y — логическая или битовая операция И.x & y – logical or bitwise AND. Обычно их можно использовать с целочисленными типами и типами enum.You can generally use this with integer types and enum types.

Оператор логического исключающего ИЛИLogical XOR Operator

Этот оператор имеет более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.This operator has higher precedence than the next section and lower precedence than the previous section.

x ^ y — логическая или битовая операция исключающего ИЛИ.x ^ y – logical or bitwise XOR. Обычно их можно использовать с целочисленными типами и типами enum.You can generally use this with integer types and enum types.

Оператор логического ИЛИLogical OR Operator

Этот оператор имеет более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.This operator has higher precedence than the next section and lower precedence than the previous section.

x | y – логическая или битовая операция ИЛИ.x | y – logical or bitwise OR. Обычно их можно использовать с целочисленными типами и типами enum.You can generally use this with integer types and enum types.

Условный оператор ИConditional AND Operator

Этот оператор имеет более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.This operator has higher precedence than the next section and lower precedence than the previous section.

x && y — логическое И.x && y – logical AND. Если первый операнд имеет значение false, то C# не вычисляет второй операнд.If the first operand evaluates to false, then C# does not evaluate the second operand.

Условный оператор ИЛИConditional OR Operator

Этот оператор имеет более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.This operator has higher precedence than the next section and lower precedence than the previous section.

x || y — логическое ИЛИ.x || y – logical OR. Если первый операнд имеет значение true, то C# не вычисляет второй операнд.If the first operand evaluates to true, then C# does not evaluate the second operand.

Оператор объединения с NULLNull-coalescing Operator

Этот оператор имеет более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.This operator has higher precedence than the next section and lower precedence than the previous section.

x ?? y — возвращает x, если значение отличается от null; в противном случае возвращает y.x ?? y – returns x if it is non-null; otherwise, returns y.

Условный операторConditional Operator

Этот оператор имеет более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.This operator has higher precedence than the next section and lower precedence than the previous section.

t ? x : y — если условие t имеет значение true, вычисляет и возвращает x, в противном случае вычисляет и возвращает y.t ? x : y – if test t evaluates to true, then evaluate and return x; otherwise, evaluate and return y.

Назначение и лямбда-операторыAssignment and Lambda Operators

Эти операторы имеют более высокий приоритет по сравнению со следующим разделом и более низкий приоритет по сравнению с предыдущим.These operators have higher precedence than the next section and lower precedence than the previous section.

x = y — назначение.x = y – assignment.

x += y — инкремент.x += y – increment. Добавьте значение y к значению x, сохраните результат в x и возвратите новое значение.Add the value of y to the value of x, store the result in x, and return the new value. Если x назначает event, то y должен быть соответствующей функцией, которую C# добавляет в качестве обработчика событий.If x designates an event, then y must be an appropriate function that C# adds as an event handler.

x -= y — декремент.x -= y – decrement. Вычтите значение y из значения x, сохраните результат в x и возвратите новое значение.Subtract the value of y from the value of x, store the result in x, and return the new value. Если x назначает event, то y должен быть соответствующей функцией, которую C# удаляет в качестве обработчика событий.If x designates an event, then y must be an appropriate function that C# removes as an event handler

x *= y — назначение с умножением.x *= y – multiplication assignment. Умножьте значение y на значение x, сохраните результат в x и возвратите новое значение.Multiply the value of y to the value of x, store the result in x, and return the new value.

x /= y — назначение с делением.x /= y – division assignment. Разделите значение x на значение y, сохраните результат в x и возвратите новое значение.Divide the value of x by the value of y, store the result in x, and return the new value.

x %= y — присваивание остатка.x %= y – remainder assignment. Разделите значение x на значение y, сохраните остаток в x и возвратите новое значение.Divide the value of x by the value of y, store the remainder in x, and return the new value.

x &= y — назначение с операцией И.x &= y – AND assignment. Выполните операцию И для значения y и значения x, сохраните результат в x и возвратите новое значение.AND the value of y with the value of x, store the result in x, and return the new value.

x |= y — назначение с операцией ИЛИ.x |= y – OR assignment. Выполните операцию ИЛИ для значения y и значения x, сохраните результат в x и возвратите новое значение.OR the value of y with the value of x, store the result in x, and return the new value.

x ^= y — назначение с операцией исключающего ИЛИ.x ^= y – XOR assignment. Выполните операцию исключающего ИЛИ для значения y и значения x, сохраните результат в x и возвратите новое значение.XOR the value of y with the value of x, store the result in x, and return the new value.

x <<= — назначение со сдвигом влево.x <<= y – left-shift assignment. Сдвиньте значение x влево на y позиций, сохраните результат в x и возвратите новое значение.Shift the value of x left by y places, store the result in x, and return the new value.

x >>= y — назначение со сдвигом вправо.x >>= y – right-shift assignment. Сдвиньте значение x вправо на y позиций, сохраните результат в x и возвратите новое значение.Shift the value of x right by y places, store the result in x, and return the new value.

=> — объявление лямбда-выражения.=> – lambda declaration.

Переполнение при арифметической операцииArithmetic Overflow

Арифметические операторы (+, -, *, /) могут возвращать результаты, выходящие за пределы диапазона возможных значений для используемого числового типа.The arithmetic operators (+, -, *, /) can produce results that are outside the range of possible values for the numeric type involved. Подробнее см. в разделе, посвященном конкретному оператору, однако в общем случае применяются следующие правила.You should refer to the section on a particular operator for details, but in general:

  • Переполнение при целочисленных арифметических операциях либо вызывает исключение OverflowException или отбрасывает старшие биты результата.Integer arithmetic overflow either throws an OverflowException or discards the most significant bits of the result. Деление целого числа на ноль всегда вызывает исключение DivideByZeroException.Integer division by zero always throws a DivideByZeroException.

    Что именно произойдет при возникновении переполнения для целочисленного значения, зависит от контекста выполнения, который может быть проверяемым или непроверяемым.When integer overflow occurs, what happens depends on the execution context, which can be checked or unchecked. В проверяемом контексте возникает исключение OverflowException.In a checked context, an OverflowException is thrown. В непроверяемом контексте старшие биты результата отбрасываются и выполнение продолжается.In an unchecked context, the most significant bits of the result are discarded and execution continues. Таким образом, C# позволяет сделать выбор между обработкой и игнорированием переполнения.Thus, C# gives you the choice of handling or ignoring overflow. По умолчанию арифметические операции выполняются в непроверяемом контексте.By default, arithmetic operations occur in an unchecked context.

    Кроме арифметических операторов, переполнение могут вызвать приведения целочисленного типа к другому целочисленному типу, например приведение long к int. Для таких ситуаций также применяются проверяемый и непроверяемый контексты.In addition to the arithmetic operations, integral-type to integral-type casts can cause overflow (such as when you cast a long to an int), and are subject to checked or unchecked execution. Однако битовые операторы и операторы сдвига никогда не вызывают переполнение.However, bitwise operators and shift operators never cause overflow.

  • Переполнение или деление на ноль при арифметических операциях с плавающей запятой никогда не вызывает исключение, так как типы с плавающей запятой — а поэтому и правила для представления бесконечности и значения NaN (не число) — основаны на стандарте IEEE 754.Floating-point arithmetic overflow or division by zero never throws an exception, because floating-point types are based on IEEE 754 and so have provisions for representing infinity and NaN (Not a Number).

  • Переполнение при десятичной арифметической операции всегда вызывает исключение OverflowException.Decimal arithmetic overflow always throws an OverflowException. Деление десятичного числа на ноль всегда вызывает исключение DivideByZeroException.Decimal division by zero always throws a DivideByZeroException.

См. такжеSee Also

Справочник по C#C# Reference
Руководство по программированию на C#C# Programming Guide
C# Перегружаемые операторыC# Overloadable Operators
Ключевые слова в C#C# Keywords