Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C# Лекция_3 Выражения и операции.docx
Скачиваний:
28
Добавлен:
18.12.2018
Размер:
667.21 Кб
Скачать
    1. Операция ?? - новая операция c# 2.0

Эта операция уже рассматривалась в предыдущей лекции, когда речь шла о типах, допускающих значение null. Напомню, все ссылочные типы изначально допускают null в качестве возможного значения. Такое значение ссылочной переменной задает неопределенную ссылку, ссылку на несуществующий объект. Значимые типы значения null не содержат, но можно определить расширенный значимый тип, включающий значение null. Синтаксически, если T - имя значимого типа, то T? - это имя расширенного типа. Операция ?? определена над операндами, допускающими значение null. Ее главная задача - присвоить переменной значение, отличное от null, поэтому иногда ее называют операцией склеивания, поскольку она позволяет "приклеить" к null значение. Рассмотрим ее определение:

A ?? B

Если операнд A отличен от null, то он и возвращается в качества результата операции. Если же он имеет значение null, то результатом является операнд B. Эту операцию особенно удобно использовать при приведении типа T? к типу T. Рассмотрим простой пример:

int? x = null;

int y = x ?? 0;

Заметьте, если между двумя присваиваниями переменная x не приобрела значение, отличное от null, то переменная y в результате получит значение 0.

В отсутствии такой операции нам пришлось бы писать для вычисления у такую эквивалентную конструкцию:

int y = (x !=null) ? (int)x : 0

    1. Лямбда-оператор - новая операция в c# 3.0

В третьей версии языка появилась новая операция, называемая лямбда-оператором, и, соответственно, новый тип выражений, называемых лямбда-выражениями. Эта операция имеет тот же приоритет, что и операция присваивания, и, так же как и последняя, является правосторонней операцией. Синтаксис лямбда-выражений следующий:

<(список входных аргументов)> => <выражение>

Содержательно выражение в правой части задает описание функции, аргументы которой задаются списком левой части. Такое описание представляет собой описание анонимной функции - функции без имени - и может быть использовано, например, при задании экземпляра делегата. Зачастую функция зависит от одного аргумента, и тогда в левой части можно указывать только имя этого аргумента, опуская скобки.

Подробно этот механизм будет рассмотрен в отдельной лекции нашего курса, а пока приведем первый простой пример использования этой операции. Рассмотрим следующую задачу. Пусть дан массив чисел X и задана функция F(x). Требуется найти минимальное значение этой функции, когда аргументы задаются элементами массива X. Конечно же, можно создать метод, реализующий вычисление функции F(x), но можно воспользоваться анонимной функцией, заданной лямбда-выражением, что демонстрирует следующий пример:

/// <summary>

/// Лямбда-оператор и лямбда-выражение

/// </summary>

static void Lambda()

{

Random rnd = new Random();

const int size = 5;

int[] numbers = new int[size];

int a = rnd.Next(-10, 10), b = rnd.Next(-10, 10),

c = rnd.Next(-10, 10);

Console.WriteLine("a={0}, b={1}, c={2}",

a, b, c);

for (int i = 0; i < size; i++)

{

numbers[i] = rnd.Next(10);

Console.Write("X[{0}] = {1}, ", i, numbers[i]);

}

int minValue = numbers.Min(x => a * x * x + b * x + c);

Console.WriteLine("Min(a*x^2 +b*x + c) = {0}", minValue);

}

Большая часть в этом примере связана с моделированием массива чисел и коэффициентов функции. Нахождение минимума функции задается одной строкой:

int minValue = numbers.Min(x => a * x * x + b * x + c);

Здесь функция Min последовательно перебирает элементы массива, формируя аргумент x функции, а лямбда-выражение преобразует его в значение функции от этого аргумента. В результате возвращается минимальное значение функции. Результаты работы метода Lambda можно видеть на рис. 3.5.

увеличить изображение Рис. 3.5. Результаты работы метода Lambda

На этом закончим рассмотрение операций языка C#, но продолжим разговор о некоторых вопросах, связанных с вычислением выражений.