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

Страница 221 из 502

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

<b>// Простой пример применения делегата.</b>

<b>using System;</b>

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

<b>delegate string StrMod(string str);</b>

<b>class DelegateTest {</b>

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

<b>  static string ReplaceSpaces(string s) {</b>

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

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

<b>  }</b>

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

<b>  static string RemoveSpaces(string s) {</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>  static string Reverse(string s) {</b>

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

<b>    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>  static void Main() {</b>

<b>    // Сконструировать делегат.</b>

<b>    StrMod strOp = new StrMod(ReplaceSpaces);</b>

<b>    string str;</b>

<b>    // Вызвать методы с помощью делегата,</b>

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

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

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

<b>    strOp = new StrMod(RemoveSpaces);</b>

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

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

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

<b>    strOp = new StrMod(Reverse);</b>

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

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

<b>  }</b>

<b>}</b>

Вот к какому результату приводит выполнение этого кода.

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

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

<b>Удаление пробелов.</b>

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

<b>Обращение строки.</b>

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

Рассмотрим данный пример более подробно. В его коде сначала объявляется делегат StrMod типа string, как показано ниже.

<b>delegate string StrMod(string str);</b>

Как видите, делегат StrMod принимает один параметр типа string и возвращает одно значение того же типа.

Далее в классе DelegateTest объявляются три статических метода с одним параметром типа string и возвращаемым значением того же типа. Следовательно, они соответствуют делегату StrMod. Эти методы видоизменяют строку в той или иной форме. Обратите внимание на то, что в методе Rep la се Spaces() для замены пробелов дефисами используется один из методов типа string — Replace().

В методе Main() создается переменная экземпляра strOp ссылочного типа StrMod и затем ей присваивается ссылка на метод ReplaceSpaces(). Обратите особое внимание на следующую строку кода.

<b>StrMod strOp = new StrMod(ReplaceSpaces);</b>

В этой строке метод ReplaceSpaces() передается в качестве параметра. При этом указывается только его имя, но не параметры. Данный пример можно обобщить: при получении экземпляра делегата достаточно указать только имя метода, на который должен ссылаться делегат. Ясно, что сигнатура метода должна совпадать с той, что указана в объявлении делегата. В противном случае во время компиляции возникнет ошибка.

Далее метод ReplaceSpaces() вызывается с помощью экземпляра делегата strOp, как показано ниже.