Рассмотрим данный пример более подробно. В его коде сначала объявляется делегат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 было внедрено специальное средство, существенно упрощающее синтаксис присваивания метода делегату. Это так называемое
Ниже приведен методMain из предыдущего примера, измененный с целью продемонстрировать групповое преобразование методов.
static void Main {