Speak.Me Учить иностранные слова

C#: выражения (Expressions) и операторы (Operators)

Выражение по сути является значением (выражает значение). Самый простой пример выражения — константа (например, 123) или переменная (например, x). Выражения можно объединять и изменять с помощью операторов. Операторы принимают один или более входящих операндов и возвращают новое выражение.

Операнды в свою очередь также могут быть выражениями (с оператором), таким образом можно создавать сложные составные (комплексные) выражения:

Операторы можно разделить на унарные, бинарные и тернарными в зависимости от количества операндов, которые принимает оператор (один, два или три). Бинарный оператор всегда располагается между двумя операндами (инфиксная запись).

Операторы встроенные в базовую часть языка называются основными (primary), например оператор вызова метода — ().

Выражения, которые не возвращают никакого значения, называются пустыми выражениями (void expression), например, Console.WriteLine (1). Пустые выражения не могут быть использованы в качестве операнда в других (комплексных) выражениях.

Выражения присваивания (Assignment Expressions)

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

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

Эта особенность может быть использована для инициализации нескольких переменных сразу:

Составные операторы присваивания (compound assignment operators) — сокращение, объединяющее присваивание с каким-либо другим оператором:

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

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

Бинарные операторы (за исключением оператора присваивания =, лямбды => и оператора объединения со значением  Null ??) — лево-ассоциативные, т.е. выполняются слева направо (например, 8/4/2 выполняется как (8/4)/2). Порядок исполнения можно изменить с помощью скобок.

Оператор присваивания, лямбда, оператор объединения со значение Null и тернарный условный оператор — право-ассоциативные, т.е. исполняются справа налево.

Сводная таблица операторов C#

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

ОператорНазваниепримерперегружаемость
Основные (Primary)
.Доступ к членамx.yнет
->Указатель на структуруx->yнет
()Вызов функцииx()нет
[]Массив/индексa[x]через индексатор
++Пост-инкрементx++да
Пост-декрементx—да
newНовый экземплярnew Foo()нет
stackallocНебезопасное выделение стекаstackalloc(10)нет
typeofПолучить тип из идентификатораtypeof(int)нет
checkedВключить проверку переполнения целочисленных типовchecked(x)нет
uncheckedВыключить проверку переполнения целочисленных типовunchecked(x)нет
defaultЗначение по умолчаниюdefault(char)нет
awaitОжиданиеawait mytaskнет
Унарные (Unary)
sizeofПолучить размер структуры (struct)sizeof(int)нет
+Положительное значение+xда
Отрицательное значение-xда
!Отрицание (не)!xда
~Поразрядное дополнение~xда
++Пре-инкремент++xда
Пре-декремент—xда
()Приведение к типу(int)xнет
*Значение по адресу*xнет
&Адрес значения&xнет
Мультипликативные (Multiplicative)
*Умножениеx * yда
/Делениеx / yда
%Остаток от деленияx % yда
Аддитивные (Additive)
+Сложениеx + yда
Вычитаниеx — yда
Операторы сдвига (Shift)
<<Сдвиг влевоx << 1да
>>Сдвиг вправоx >> 1да
ОПЕРАТОРЫ ОТНОШЕНИЙ (Relational)
<Меньше чемx < yда
>Больше чемx > yда
<=Меньше или равноx <= yда
>=Больше или равноx >= yда
isПринадлежность экземпляра к типуx is yнет
asПреобразование типаx as yнет
Операторы равенства (Equality)
==Равноx == yда
!=Не равноx != yда
Логическое И (Logical And)
&Иx & yда
Логическое исключающее ИЛИ (Logical Xor)
^Исключающее ИЛИx ^ yда
Логическое ИЛИ (Logical Or)
|ИЛИx | yда
Условное И (Conditional And)
&&Условное Иx && yчерез &
Условное ИЛИ (Conditional Or)
||Условное ИЛИx || yчерез |
Тернарный Условный оператор (Conditional (Ternary))
? :УсловиеisTrue ? then
This : elseThis
нет
Присваивание и лямбда (Assignment and lambda)
=Присвоитьx = yнет
*=Умножить себя наx *= 2через *
/=Разделить себя наx /= 2через /
+=Прибавить к себеx += 2через +
-=Вычесть из себяx -= 2через —
<<=Сдвинуть себя влево наx <<= 2через <<
>>=Сдвинуть себя вправо наx >>= 2через >>
&=Назначение Иx &= 2через &
^=Назначение исключающего ИЛИx ^= 2через ^
|=Назначение ИЛИx |= 2через |
=>Лямбдаx => x + 1нет