Блочное лямбда-выражение возвращает факториал



Передаваемого ему значения.

IntOp fact = n => {

int r = 1;

for (int i=1; i <= n; i++)

r = i * r;

return r;

};

Console.WriteLine("Факториал 3 равен " + fact(3));

Console.WriteLine("Факториал 5 равен " + fact(5));

}

}

 

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

 

Факториал 3 равен 6  

Факториал 5 равен 120

 

В приведенном выше примере обратите внимание на то, что в теле блочного лямбда-выражения объявляется переменная r, организуется цикл for и используется оператор return. Все эти элементы вполне допустимы в блочном лямбда-выражении. И в этом отношении оно очень похоже на анонимный метод. Следовательно, многие анонимные методы могут быть преобразованы в блочные лямбда-выражения при обновлении унаследованного кода. И еще одно замечание: когда в блочном лямбда-выражении встречается оператор return, он просто обусловливает возврат из лямбда-выражения, но не возврат из охватывающего метода.

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

 

// Первый пример применения делегатов, переделанный с

// целью использовать блочные лямбда-выражения.

using System;

 

// Объявить тип делегата,

delegate string StrMod(string s);

 

class UseStatementLambdas {

static void Main() {

Создать делегаты, ссылающиеся на лямбда- выражения,

Выполняющие различные операции с символьными строками.

 

Заменить пробелы дефисами.

StrMod ReplaceSpaces = s => {

Console.WriteLine("Замена пробелов дефисами.");

return s.Replace(' ', '-');

};

 

Удалить пробелы.

StrMod RemoveSpaces = s => {

string temp = "";

int i;

Console.WriteLine("Удаление пробелов.");

for(i=0; i < s.Length; i++)

if(s[i] != ' ') temp += s[i];

return temp;

};

 

Обратить строку.

StrMod Reverse = s => {

string temp = ""; int i, j;

Console.WriteLine("Обращение строки.");

for(j=0, i=s.Length-1; i >= 0; i--, j++) temp += s[i];

return temp;

};

 

string str;

 

Обратиться к лямбда-выражениям с помощью делегатов.

StrMod strOp = ReplaceSpaces;

str = strOp("Это простой тест.");

 

Console.WriteLine("Результирующая строка: " + str);

Console.WriteLine() ;

 

strOp = RemoveSpaces;

str = strOp("Это простой тест.");

Console.WriteLine("Результирующая строка: " + str);

Console.WriteLine();

 

strOp = Reverse;

str = strOp("Это простой тест.");

Console.WriteLine("Результирующая строка: " + str);

}

}

 

Результат выполнения кода этого примера оказывается таким же, как и в первом примере применения делегатов.

 

Замена пробелов дефисами.

Результирующая строка: Это-простой-тест.

Удаление пробелов.

Результирующая строка: Этопростойтест.

Обращение строки.

Результирующая строка: .тсет йотсорп отЭ

 

 

События

 

Еще одним важным средством С#, основывающимся на делегатах, является событие. Событие, по существу, представляет собой автоматическое уведомление о том, что произошло некоторое действие. События действуют по следующему принципу: объект, проявляющий интерес к событию, регистрирует обработчик этого события. Когда же событие происходит, вызываются все зарегистрированные обработчики этого события. Обработчики событий обычно представлены делегатами.

События являются членами класса и объявляются с помощью ключевого слова event. Чаще всего для этой цели используется следующая форма:

 

event делегат_события имя_события;

 

где делегат_события обозначает имя делегата, используемого для поддержки события, а имя_событмя — конкретный объект объявляемого события.

Рассмотрим для начала очень простой пример.

 

// Очень простой пример, демонстрирующий событие,

using System;

 

// Объявить тип делегата для события,

delegate void MyEventHandler();

 

// Объявить класс, содержащий событие,

class MyEvent {

public event MyEventHandler SomeEvent;

Этот метод вызывается для запуска события,

public void OnSomeEvent() {

if (SomeEvent != null)

SomeEvent();

}

}

 

class EventDemo {

// Обработчик события,

static void Handler() {

Console.WriteLine("Произошло событие");

}

 

static void Main() {

MyEvent evt = new MyEvent();


Дата добавления: 2019-02-12; просмотров: 276; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!