На этом шаге мы рассмотрим последний пример использования делегатов.
Еще один небольшой пример иллюстрирует особенности реализации ссылок на методы объектов. Рассмотрим программный код, представленный ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr172_1 { // Объявление делегата: delegate void MyDelegate(int n); // Класс: class MyClass { // Закрытое целочисленное поле: private int number; // Конструктор с одним аргументом: public MyClass(int n) { // Присваивание значения полю: set(n); } // Метод для присваивания значения полю: public void set(int n) { // Присваивание значения полю: number = n; } // Переопределение метода ToString(): public override string ToString() { return "Поле number = " + number; } } // Класс с главным методом: class Program { // Главный метод: static void Main() { // Создание объекта: MyClass A = new MyClass(100); // Объектная переменная ссылается // на ранее созданный объект: MyClass B = A; // Переменной типа делегата значением присваивается // ссылка на метод объекта: MyDelegate apply = A.set; // Переменной присваивается ссылка на новый объект: A = new MyClass(200); // Проверка значений полей объектов: Console.WriteLine(A); Console.WriteLine(B); // Вызов экземпляра делегата: apply(300); Console.WriteLine(); // Проверка значений полей объектов: Console.WriteLine(A); Console.WriteLine(B); // Задержка: Console.ReadLine(); } } }
Ниже показано, как выглядит результат выполнения программы:
Рис.1. Результат выполнения программы
В программе объявляется делегат MyDelegate, соответствующий методам, имеющим целочисленный аргумент и не возвращающим результат. Также мы используем класс MyClass. В классе описано закрытое целочисленное поле number. Значение полю присваивается при создании объекта. Не возвращающий результат метод set() получает при вызове целочисленный аргумент, значение которого присваивается полю number. Также в классе переопределен метод ToString(), возвращающий результатом текстовую строку со значением поля number объекта.
В главном методе мы с помощью команды
MyClass A = new MyClass(100);
MyClass B = A;
MyDelegate apply = A.set;
A = new MyClass(200);
MyDelegate apply = A.set;
Проверить справедливость данного утверждения легко. У нас есть две переменные: переменная A ссылается на новый объект (значение поля 200), а переменная B ссылается на исходный объект (значение поля 100). Сначала проверяем значения полей объектов (команды
Console.WriteLine(A);
Console.WriteLine(B);
apply(300);
Со следующего шага мы начнем изучение анонимных методов.