Просто о делегатах
В общем случае делегат представляет собой объект, который может ссылаться на метод. Следовательно, когда создается делегат, то в итоге получается объект, содержащий ссылку на метод. Более того, метод можно вызывать по этой ссылке. Иными словами, делегат позволяет вызывать метод, на который он ссылается.
По сути, делегат — это безопасный в отношении типов объект, указывающий на другой метод (или, возможно, список методов) приложения, который может быть вызван позднее. В частности, объект делегата поддерживает три важных фрагмента информации:
— адрес метода, на котором он вызывается;
— аргументы (если есть) этого метода;
— возвращаемое значение (если есть) этого метода.
Как только делегат создан и снабжен необходимой информацией, он может динамически вызывать методы, на которые указывает, во время выполнения.
Определение типа делегата в C#
Тип делегата объявляется с помощью ключевого слова delegate. Ниже приведена общая форма объявления делегата:
delegate возвращаемый_тип имя_делегата (список_параметров);
где возвращаемый_тип обозначает тип значения, возвращаемого методами, которые будут вызываться делегатом;
имя_делегата — конкретное имя делегата;
список_параметров — параметры, необходимые для методов, вызываемых делегатом.
Как только будет создан экземпляр делегата, он может вызывать и ссылаться на те методы, возвращаемый тип и параметры которых соответствуют указанным в объявлении делегата. Для создания экземпляра делегата и связывания его с конкретным методом следует записать:
имя_делегата экземпляр_делегата = new имя_делегата(метод);
Главное, что делегат может служить для вызова любого метода с соответствующей сигнатурой и возвращаемым типом. Вызываемый метод может быть методом экземпляра, связанным с отдельным объектом, или же статическим методом, связанным с конкретным классом. Значение имеет лишь одно: возвращаемый тип и сигнатура метода должны быть согласованы с теми, которые указаны в объявлении делегата.
Для связывания с другим методом данного экземпляра делегата достаточно написать:
экземпляр_делегата = new имя_делегата(другой_метод);
Пример:
using System; namespace Делегаты_и_Методы { // Создадим делегат delegate int Arifm_Operation (int i, int j); // класс арифметических операций class Arifmetika2 { public int Sum(int x, int y) { return x + y; } public int Prz(int x, int y) { return x * y; } } class Program { // статические методы класса static int Sum(int x, int y) { return x + y; } static int Prz(int x, int y) { return x * y; } static void Main() { Arifmetika2 operA = new Arifmetika2(); // новый объект // Свяжем экземпляр делегата со статическим методом Arifm_Operation oper = new Arifm_Operation(Sum); int res1 = oper(5, 11); // Свяжем экземпляр делегата с методом объекта operA oper = new Arifm_Operation(operA.Sum); int res2 = oper(10, 5); Console.WriteLine("Сумма: " + res1 + " или " + res2); // То же для произведений oper = new Arifm_Operation(Prz); res1 = oper(5, 11); oper = new Arifm_Operation(operA.Prz); res2 = oper(10, 5); Console.WriteLine("Произведение: " + res1 + " или " + res2); Console.ReadLine(); } } }
Примечание. Такой способ вызова методов с использованием объектов (экземпляров) делегата был единственным в версии языка C# 1.0 и Visual Studio .Net (c февраля 2002 года). В следующих версиях языка C# 2.0 (Net 2.0, 2005 год) и C# 3.0 (Net 3.5, 2008 год) появились другие способы, связанные с понятием анонимных функций (анонимные методы и лямбда-выражения).
Перейдем к рассмотрению свойств — важнейших разновидностей член-функций классов.
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.