Добавить в цитаты Настройки чтения

Страница 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 =&gt; {</b>

<b>      int r = 1;</b>

<b>      for (int i=1; i &lt;= n; i++)</b>

<b>        r = i * r;</b>

<b>      return r;</b>

<b>    };</b>

<b>    Console.WriteLine(&quot;Факториал 3 равен &quot; + fact(3));</b>

<b>    Console.WriteLine(&quot;Факториал 5 равен &quot; + 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 =&gt; {</b>

<b>      Console.WriteLine(&quot;Замена пробелов дефисами.&quot;);</b>

<b>      return s.Replace(' ', '-');</b>

<b>    };</b>

<b>    // Удалить пробелы.</b>

<b>    StrMod RemoveSpaces = s =&gt; {</b>

<b>      string temp = &quot;&quot;;</b>

<b>      int i;</b>

<b>      Console.WriteLine(&quot;Удаление пробелов.&quot;);</b>

<b>      for(i=0; i &lt; s.Length; i++)</b>

<b>        if(s[i] != ' ') temp += s[i];</b>

<b>      return temp;</b>

<b>    };</b>

<b>    // Обратить строку.</b>

<b>    StrMod Reverse = s =&gt; {</b>

<b>      string temp = &quot;&quot;; int i, j;</b>

<b>      Console.WriteLine(&quot;Обращение строки.&quot;);</b>

<b>      for(j=0, i=s.Length-1; i &gt;= 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(&quot;Это простой тест.&quot;);</b>

<b>    Console.WriteLine(&quot;Результирующая строка: &quot; + str);</b>

<b>    Console.WriteLine() ;</b>

<b>    strOp = RemoveSpaces;</b>

<b>    str = strOp(&quot;Это простой тест.&quot;);</b>

<b>    Console.WriteLine(&quot;Результирующая строка: &quot; + str);</b>

<b>    Console.WriteLine();</b>

<b>    strOp = Reverse;</b>

<b>    str = strOp(&quot;Это простой тест.&quot;);</b>