Делегаты и методы

Просто о делегатах

В общем случае делегат представляет собой объект, который может ссылаться на метод. Следовательно, когда создается делегат, то в итоге получается объект, содержащий ссылку на метод. Более того, метод можно вызывать по этой ссылке. Иными словами, делегат позволяет вызывать метод, на который он ссылается.
По сути, делегат — это безопасный в отношении типов объект, указывающий на другой метод (или, возможно, список методов) приложения, который может быть вызван позднее. В частности, объект делегата поддерживает три важных фрагмента информации:

— адрес метода, на котором он вызывается;
— аргументы (если есть) этого метода;
— возвращаемое значение (если есть) этого метода.

Как только делегат создан и снабжен необходимой информацией, он может динамически вызывать методы, на которые указывает, во время выполнения.

Определение типа делегата в 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 год) появились другие способы, связанные с понятием анонимных функций (анонимные методы и лямбда-выражения).

Перейдем к рассмотрению свойств — важнейших разновидностей член-функций классов.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх