StrMod типа string, как показано ниже.

delegate string StrMod(string str);

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

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

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

StrMod strOp = new StrMod(ReplaceSpaces);

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

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

str = strOp('Это простой тест.');

Экземпляр делегата strOp ссылается на метод ReplaceSpaces (), и поэтому вызывается именно этот метод.

Затем экземпляру делегата strOp присваивается ссылка на метод RemoveSpaces (), и с его помощью вновь вызывается указанный метод — на этот раз RemoveSpaces ().

И наконец, экземпляру делегата strOp присваивается ссылка на метод Reverse (). А в итоге вызывается именно этот метод.

Главный вывод из данного примера заключается в следующем: в тот момент, когда происходит обращение к экземпляру делегата strOp, вызывается метод, на который он ссылается. Следовательно, вызов метода разрешается во время выполнения, а не в процессе компиляции.

Групповое преобразование делегируемых методов

Еще в версии C# 2.0 было внедрено специальное средство, существенно упрощающее синтаксис присваивания метода делегату. Это так называемое групповое преобразование методов, позволяющее присвоить имя метода делегату, не прибегая к оператору new или явному вызову конструктора делегата.

Ниже приведен метод Main () из предыдущего примера, измененный с целью продемонстрировать групповое преобразование методов.

static void Main() {

// Сконструировать делегат, используя групповое преобразование методов. StrMod strOp = ReplaceSpaces; // использовать групповое преобразование методов string str;

// Вызвать методы с помощью делегата, str = strOp('Это простой тест.');

Console.WriteLine('Результирующая строка: ' + str);

Console.WriteLine();

strOp = RemoveSpaces; // использовать групповое преобразование методов str = strOp('Это простой тест.');

Console.WriteLine('Результирующая строка: ' + str);

Console.WriteLine() ;

strOp -= Reverse; // использовать групповое преобразование методов str = strOp('Это простой тест.');

Console.WriteLine('Результирующая строка: ' + str);

Console.WriteLine() ;

}

Обратите особое внимание на то, как создается экземпляр делегата strOp и как ему присваивается метод Rep la се Spaces в следующей строке кода.

strOp = RemoveSpaces; // использовать групповое преобразование методов

В этой строке кода имя метода присваивается непосредственно экземпляру делегата strOp, а все заботы по автоматическому преобразованию метода в тип делегата 'возлагаются' на средства С#. Этот синтаксис может быть распространен на любую ситуацию, в которой метод присваивается или преобразуется в тип делегата.

Синтаксис группового преобразования методов существенно упрощен по сравнению с прежним подходом к делегированию, поэтому в остальной части книги используется именно

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату