воскресенье, 9 января 2022 г.

Делегаты C#

 Делегаты C# обладают следующими свойствами:

  • позволяют обрабатывать методы в качестве аргумента;
  • могут быть связаны вместе;
  • несколько методов могут быть вызваны по одному событию;
  • тип делегата определяется его именем;
  • не зависят от класса объекта, на который ссылается;
  • сигнатура метода должна совпадать с сигнатурой делегата.

Синтаксис

Шаг 1 — Объявление

modifier delegate ReturnType DelegateName ([Parameter_1]);

Шаг 2 — Инициализация

Делегат инициализируется путём передачи ему имени метода в качестве аргумента.

DelegateName DelgObjectName = new DelegateName(MethodName);

Шаг 3 — Вызов

Вызываем созданный делегат с указанием параметров, если это необходимо.

DelegateObjectName([Parameter_1]);

Пример 1

Нижеприведённый код складывает между собой два числа:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelgateForNotes
{
  class Program
  {
    // Объявление делегата, ссылающегося на функцию
    // с двумя параметрами и целочисленным результатом
    public delegate int AddDelegate(int num1, int num2);

    static void Main(string[] args)
    {
      // Создание метода делегата и передача функции Add в качестве аргумента
      AddDelegate funct1 = new AddDelegate(Add);
      // Вызов делегата
      int k = funct1(7, 2);
      Console.WriteLine("Sumation = {0}", k);
      Console.Read();
    }

    // Статическая функция Add с той же сигнатурой, что и у делегата
    public static int Add(int num1, int num2)
    {
      Console.WriteLine("I am called by Delegate");
      int sumation;
      sumation = num1 + num2;
      return sumation;
    }
  }
}

Выводом будет следующий результат:

А вы вообще уверены, что правильно понимаете, что такое делегат? Так вот, делегат в c# - это такая сущность, которая может представлять собой некий метод. Можно сказать, что делегат определяет сигнатуру метода и его возвращаемое значение. (а можно также сказать, что делегат - это такой указатель на функцию, как, скажем, в С++, но с некотрыми оговорками).

Так вот Func (и любая его разновидность в том числе) - это всего лишь разновидность делегата. То есть любой Func - делегат, но не любой делегат - Func и сравнивать их не очень уместно.
А что касается этого:

Оба используются я целью возвращения значения, оба могут принимать несколько параметров

то вот вам пример делегата, который не принимает аргументов и не возвращает значений:

    delegate void SomeDelegate();







Комментариев нет:

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

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...