Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Операторы

Оператор в C# — это термин или символ, получающий на вход одно или несколько выражений (операндов) и возвращающий значение. Операторы, получающие на вход только один операнд, например оператор приращения (++) или new, называются унарными операторами. Операторы, получающие на вход два операнда, например, арифметические операторы (+, -, *, /) называются бинарными. Один оператор — условный оператор (?:) получает на вход три операнда и является единственным третичным оператором в C#.

Следующая строка кода C# содержит один унарный оператор и один операнд. Оператор приращения ++ изменяет значение операнда y:

y++;

Следующая строка кода C# содержит два бинарных оператора, каждый с двумя операндами. Оператор присвоения = получает y и выражение 2 + 3 в качестве операндов. Выражение 2 + 3 само содержит оператор сложения и использует в качестве операндов целочисленные значения 2 и 3.

y = 2 + 3;

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

Категория

Выражение

Описание

Основная

x.y

Доступ к членам

f(x)

Вызов метода и делегата

a[x]

Доступ к массиву и индексатору

x++

Постфиксное приращение

x--

Постфиксное уменьшение

new T(...)

Создание объекта и делегата

new T(...){...}

Создание объекта с инициализатором. См. раздел Инициализаторы объектов и коллекций.

new {...}

Анонимный инициализатор объекта. См. раздел Анонимные типы.

new T[...]

Создание массива. См. раздел Массивы.

typeof(T)

Получение объекта System.Type для T

checked(x)

Вычисление выражения в проверенном контексте

unchecked(x)

Вычисление выражения в непроверенном контексте

default (T)

Получение значения по умолчания для типа T

delegate {}

Анонимная функция (анонимный метод)

Унарные

+x

Идентификация

-x

Отрицание

!x

Логическое отрицание

~x

Поразрядное отрицание

++x

Префиксное приращение

--x

Префиксное уменьшение

(T)x

Явное преобразование x в тип T

Мультипликативные

*

Умножение

/

Деление

%

Остаток

Аддитивные

x + y

Сложение, объединение строк, объединение делегатов

x - y

Вычитание, удаление делегатов

Сдвиг

x << y

Сдвиг влево

x >> y

Сдвиг вправо

Относительные и тестирующие типы

x < y

Меньше

x > y

Больше

x <= y

Меньше или равно

x >= y

Больше или равно

x is T

Возвращает значение true, если x относится к типу T, в противном случае возвращает значение false

x as T

Возвращает x типа T или нулевое значение, если x не относится к типу T

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

x == y

Равно

x != y

Не равно

Логическое AND

x & y

Целочисленное поразрядное AND, логическое AND

Логическое исключающее XOR

x ^ y

Целочисленное поразрядное исключающее XOR, логическое исключающее XOR

Логическое OR

x | y

Целочисленное поразрядное OR, логическое OR

Условное AND

x && y

Вычисляет y только если x имеет значение true

Условное OR

x || y

Вычисляет y только если x имеет значение false

Объединение нулей

X ?? y

Равно y, если x — нулевое, в противном случае равно x

Условные

x ?: y : z

Равно y, если x имеет значение true, z если x имеет значение false

Присвоение или анонимная функция

=

Операторы присвоения

x op= y

Составные операторы присвоения: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

(T x) => y

Анонимная функция (лямбда-выражение).

When two operators with the same precedence are present in an expression, they are evaluated based on associativity. Left-associative operators are evaluated in order from left to right. For example, x * y / z is evaluated as (x * y) / z. Right-associative operators are evaluated in order from right to left. The assignment operators and the tertiary operator (?:) are right-associative. All other binary operators are left-associative. However, C# standard does not specify when, in an expression, the "set" portion of an increment instruction is executed. For example, the output of the following example code is 6:

int num1 = 5;

num1++;

System.Console.WriteLine(num1);

However, the output of the following example code is undefined:

int num2 = 5;

num2 = num2++; //not recommended

System.Console.WriteLine(num2);

Therefore, the latter example is not recommended. Parentheses can be used to surround an expression and force that expression to be evaluated before any others. For example, 2 + 3 * 2 would normally become 8. This is because multiplicative operators take precedence over additive operators. Writing the expression as (2 + 3 ) * 2 results in 10, because it indicates to the C# compiler that the addition operator (+) must be evaluated before the multiplication operator (*).

You can change the behavior of operators for custom classes and structs. This process is called operator overloading. This process is called operator overloading. For more information, see Overloadable Operators.

Когда выражение содержит два оператора с одинаковым порядком применения, они вычисляются на основе ассоциативности. Запросы с левой ассоциативностью вычисляются слева направо. Например, x * y / z вычисляется как (x * y) / z. Запросы с правой ассоциативностью вычисляются справа налево. Операторы присвоения и третичный оператор (?:) имеют правую ассоциативность. Все прочие двоичные операторы имеют левую ассоциативность. Однако стандарт C# не указывает, когда в выражении выполняется часть "set" инструкции приращения. Например, результатом следующего примера кода является число 6:

int num1 = 5;

num1++;

System.Console.WriteLine(num1);

Результат следующего примера кода не определен:

int num2 = 5;

num2 = num2++; //not recommended

System.Console.WriteLine(num2);

Поэтому применять последний пример не рекомендуется. Можно заключать выражения в скобки для принудительного вычисления некоторых частей выражения раньше других. Например, выражение 2 + 3 * 2 в обычном случае будет иметь значение 8, поскольку операторы умножения выполняются раньше операторов сложения. Результатом выражения (2 + 3) * 2 будет число 10, поскольку компилятор C# получит данные о том, что оператор сложения (+) нужно вычислить до оператора умножения (*).

Поведение операторов для пользовательских классов и структур можно изменить. Такой процесс называется перегрузкой операторов. Дополнительные сведения см. в разделе Перегружаемые операторы.

Anonymous Functions

As described elsewhere, a delegate is a type that wraps a method call. A delegate instance can be passed between methods just like a type, and it can be invoked like a method. An anonymous function is an "inline" statement or expression that can be used wherever a delegate type is expected. You can use it to initialize a named delegate or pass it instead of a named delegate type as a method parameter.

There are two kinds of anonymous functions, which are discussed individually in the following topics:

  • Lambda Expressions.

  • Anonymous Methods

Note:

Lambda expressions can be bound to expression trees and also to delegates.

The Evolution of Delegates in C#

In C# 1.0, you created an instance of a delegate by explicitly initializing it with a method that was defined elsewhere in the code. C# 2.0 introduced the concept of anonymous methods as a way to write unnamed inline statement blocks that can be executed in a delegate invocation. C# 3.0 introduces lambda expressions, which are similar in concept to anonymous methods but more expressive and concise. These two features are known collectively as anonymous functions. In general, applications that target version 3.5 and later of the .NET Framework should use lambda expressions.

The following example demonstrates the evolution of delegate creation from C# 1.0 to C# 3.0: