StrMod reverseStr = Reverse; string str = "Это простой тест.";
// Организовать групповую адресацию. strOp = replaceSp;
strOp += reverseStr;
// Обратиться к делегату с групповой адресацией. strOp(ref str);
Console.WriteLine("Результирующая строка: " + str);
Console.WriteLine;
// Удалить метод замены пробелов и добавить метод удаления пробелов. strOp -= replaceSp; strOp += removeSp;
str = "Это простой тест."; // восстановить исходную строку
// Обратиться к делегату с групповой адресацией. strOp(ref str);
Console.WriteLine("Результирующая строка: " + str);
Console.WriteLine ;
}
}
Выполнение этого кода приводит к следующему результату.
Замена пробелов дефисами.
Обращение строки.
Результирующая строка: .тсет-йотсорп-отЭ
Обращение строки.
Удаление пробелов.
Результирующая строка: .тсетйотсорпотЭ
В методеMain из рассматриваемого здесь примера кода создаются четыре экземпляра делегата. Первый из них,strOp,является пустым, а три остальных ссылаются на конкретные методы видоизменения строки. Затем организуется групповая адресация для вызова методовRemoveSpaces () иReverse . Это делается в приведенных ниже строках кода.
strOp = replaceSp; strOp += reverseStr
Сначала делегатуstrOpприсваивается ссылкаreplaceSp,а затем с помощью оператора += добавляется ссылкаreverseStr.При обращении к делегатуstrOpвызываются оба метода, заменяя пробелы дефисами и обращая строку, как и показывает приведенный выше результат.
Далее ссылкаreplaceSpудаляется из цепочки вызовов в следующей строке кода:
strOp -= replaceSp;
и добавляется ссылкаremoveSpв строке кода.
strOp += removeSp;
После этого вновь происходит обращение к делегатуstrOp.На этот раз обращается строка с удаленными пробелами.
Цепочки вызовов являются весьма эффективным механизмом, поскольку они позволяют определить ряд методов, выполняемых единым блоком. Благодаря этому улучшается структура некоторых видов кода. Кроме того, цепочки вызовов имеют особое значение для обработки событий, как станет ясно в дальнейшем.
Ковариантность и контравариантность