Страница 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("Замена пробелов дефисами.");</b>
<b> return s.Replace(' ', '-');</b>
<b> }</b>
<b> // Удалить пробелы.</b>
<b> static string RemoveSpaces(string 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> static string Reverse(string s) {</b>
<b> string temp = "";</b>
<b> 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> static void Main() {</b>
<b> // Сконструировать делегат.</b>
<b> StrMod strOp = new StrMod(ReplaceSpaces);</b>
<b> string str;</b>
<b> // Вызвать методы с помощью делегата,</b>
<b> str = strOp("Это простой тест.");</b>
<b> Console.WriteLine("Результирующая строка: " + str);</b>
<b> Console.WriteLine();</b>
<b> strOp = new StrMod(RemoveSpaces);</b>
<b> str = strOp("Это простой тест.");</b>
<b> Console.WriteLine("Результирующая строка: " + str);</b>
<b> Console.WriteLine();</b>
<b> strOp = new StrMod(Reverse);</b>
<b> str = strOp("Это простой тест.");</b>
<b> Console.WriteLine("Результирующая строка: " + 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, как показано ниже.