Блочное лямбда-выражение возвращает факториал
Передаваемого ему значения.
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!