Страница 230 из 502
<b>// Продемонстрировать применение блочного лямбда-выражения,</b>
<b>using System;</b>
<b>// Делегат IntOp принимает один аргумент типа int </b>
<b>// и возвращает результат типа int.</b>
<b>delegate int IntOp(int end);</b>
<b>class StatementLambdaDemo {</b>
<b> static void Main() {</b>
<b> // Блочное лямбда-выражение возвращает факториал</b>
<b> // передаваемого ему значения.</b>
<b> IntOp fact = n => {</b>
<b> int r = 1;</b>
<b> for (int i=1; i <= n; i++)</b>
<b> r = i * r;</b>
<b> return r;</b>
<b> };</b>
<b> Console.WriteLine("Факториал 3 равен " + fact(3));</b>
<b> Console.WriteLine("Факториал 5 равен " + fact(5));</b>
<b> }</b>
<b>}</b>
При выполнении этого кода получается следующий результат.
<b>Факториал 3 равен 6 </b>
<b>Факториал 5 равен 120</b>
В приведенном выше примере обратите внимание на то, что в теле блочного лямбда-выражения объявляется переменная r, организуется цикл for и используется оператор return. Все эти элементы вполне допустимы в блочном лямбда-выражении. И в этом отношении оно очень похоже на анонимный метод. Следовательно, многие анонимные методы могут быть преобразованы в блочные лямбда-выражения при обновлении унаследованного кода. И еще одно замечание: когда в блочном лямбда-выражении встречается оператор return, он просто обусловливает возврат из лямбда-выражения, но не возврат из охватывающего метода.
И в заключение рассмотрим еще один пример, демонстрирующий блочное лямбда-выражение в действии. Ниже приведен вариант первого примера из этой главы, измененного с целью использовать блочные лямбда-выражения вместо автономных методов для выполнения различных операций со строками.
<b>// Первый пример применения делегатов, переделанный с</b>
<b>// целью использовать блочные лямбда-выражения.</b>
<b>using System;</b>
<b>// Объявить тип делегата,</b>
<b>delegate string StrMod(string s);</b>
<b>class UseStatementLambdas {</b>
<b> static void Main() {</b>
<b> // Создать делегаты, ссылающиеся на лямбда- выражения,</b>
<b> // выполняющие различные операции с символьными строками.</b>
<b> // Заменить пробелы дефисами.</b>
<b> StrMod ReplaceSpaces = s => {</b>
<b> Console.WriteLine("Замена пробелов дефисами.");</b>
<b> return s.Replace(' ', '-');</b>
<b> };</b>
<b> // Удалить пробелы.</b>
<b> StrMod RemoveSpaces = s => {</b>
<b> string temp = "";</b>
<b> int i;</b>
<b> Console.WriteLine("Удаление пробелов.");</b>
<b> for(i=0; i < s.Length; i++)</b>
<b> if(s[i] != ' ') temp += s[i];</b>
<b> return temp;</b>
<b> };</b>
<b> // Обратить строку.</b>
<b> StrMod Reverse = s => {</b>
<b> string temp = ""; int i, j;</b>
<b> Console.WriteLine("Обращение строки.");</b>
<b> for(j=0, i=s.Length-1; i >= 0; i--, j++) temp += s[i];</b>
<b> return temp;</b>
<b> };</b>
<b> string str;</b>
<b> // Обратиться к лямбда-выражениям с помощью делегатов.</b>
<b> StrMod strOp = ReplaceSpaces;</b>
<b> str = strOp("Это простой тест.");</b>
<b> Console.WriteLine("Результирующая строка: " + str);</b>
<b> Console.WriteLine() ;</b>
<b> strOp = RemoveSpaces;</b>
<b> str = strOp("Это простой тест.");</b>
<b> Console.WriteLine("Результирующая строка: " + str);</b>
<b> Console.WriteLine();</b>
<b> strOp = Reverse;</b>
<b> str = strOp("Это простой тест.");</b>