На этом шаге мы рассмотрим программу, иллюстрирующую использование анонимных методов.
В примере ниже представлена программа, в которой используются анонимные методы.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr174_1 { // Объявление первого делегата: delegate int Alpha(int n); // Объявление второго делегата: delegate void Bravo(string t); // Класс: class MyClass { // Открытое целочисленное поле: public int number; // Конструктор: public MyClass(int n) { number = n; // Значение поля } // Поле, являющееся ссылкой на экземпляр делегата: public Alpha method; } // Класс с главным методом: class Program { // Главный метод: static void Main() { // Создание объектов: MyClass A = new MyClass(100); MyClass B = new MyClass(200); // Полю объекта значением присваивается // анонимный метод: A.method = delegate(int n) { return A.number + n; }; // Полю объекта значением присваивается // анонимный метод: B.method = delegate(int n) { return B.number - n; }; // Целочисленная переменная: int x = 80; // Вызов экземпляра делегата: Console.WriteLine("A.method({0}) = {1}", x, A.method(x)); // Присваивание нового значения полю: A.number = 300; // Вызов экземпляров делегата: Console.WriteLine("A.method({0}) = {1}", x, A.method(x)); Console.WriteLine("B.method({0}) = {1}", x, B.method(x)); // Объявление переменной типа делегата: Bravo show; // Присваивание переменной анонимного метода: show = delegate(string t) { Console.WriteLine("Teкст: \"{0}\"", t); }; // Вызов экземпляра делегата: show("Bravo"); // Присваивание переменной анонимного метода: show = delegate(string t) { for(int k = 0; k < t.Length; k++) { Console.Write("|" + t[k]); } Console.WriteLine("|"); }; // Вызов экземпляра делегата: show("Bravo"); // Задержка: Console.ReadLine(); } } }
Ниже представлен результат выполнения программы:
Рис.1. Результат выполнения программы
В программе мы объявляем два делегата: делегат Alpha соответствует методам, имеющим целочисленный аргумент и возвращающим целочисленный результат, а делегат Bravo подразумевает использование методов, имеющих текстовый аргумент и не возвращающих результат.
Класс MyClass имеет открытое целочисленное поле number, значение которому присваивается при вызове конструктора. Также в классе объявлено поле method типа Alpha. В это поле можно записать ссылку на экземпляр делегата, ссылающегося на метод, имеющий целочисленный аргумент и возвращающий целочисленный результат. Но на практике это означает, что значением полю можно присвоить ссылку на метод и, как следствие, такому полю можно присвоить в качестве значения анонимный метод.
В главном методе программы командами
MyClass A = new MyClass(100);
MyClass B = new MyClass(200);
Далее полю method каждого из объектов значением присваивается анонимный метод. Для объекта A команда присваивания следующая:
A.method = delegate(int n) { return A.number + n; };
Полю method объекта A присваивается в качестве значения конструкция, которая начинается с ключевого слова delegate и заканчивается закрывающей фигурной скобкой, после которой стоит точка с запятой. То есть значением присваивается такое выражение:
delegate(int n) { return A.number + n; };
Это и есть описание анонимного метода. У него один целочисленный аргумент (обозначен как n), а результатом метод возвращает значение выражения A.number+n (сумма значения поля number объекта A и аргумента метода n). Именно такой код будет выполняться при вызове экземпляра делегата, на который ссылается поле method объекта A.
Полю method объекта B также присваивается анонимный метод, но немного другой. Соответствующая команда выглядит следующим образом:
B.method = delegate(int n) { return B.number - n; };
В данном случае анонимный метод определен таким образом, что результатом он возвращает разность значения поля number объекта B и аргумента метода n.
Работу анонимных методов проверяем, вызывая соответствующие экземпляры делегатов командами A.method(x)) и B.method(x) (при значении 80 для переменной x). Легко убедиться, что результат вычисляется в соответствии с тем, как мы определили анонимные методы.
Также в главном методе командой
Bravo show;
show = delegate(string t) { Console.WriteLine("Teкст: \"{0}\"", t); };
Переменной значением присваивается анонимный метод, который отображает в консольном окне сообщение, содержащее в двойных кавычках текст, переданный аргументом методу. После выполнения такого присваивания командой
show("Bravo");
show = delegate(string t) { for(int k = 0; k < t.Length; k++) { Console.Write("|" + t[k]); } Console.WriteLine("|"); };
На этот раз текстовый аргумент метода отображается посимвольно в консольном окне, с использованием вертикальной черты в качестве разделителя символов. С помощью команды
show("Bravo");
На следующем шаге мы рассмотрим использование аннимных методов.