# Делегаты

```csharp
delegate void DelegateType(int a);
```

Делегат - класс, который позволяет хранить в себе ссылку на метод с определённой сигнатурой (порядком и типами принимаемых и типом возвращаемого значений) произвольного класса.

\--------------от меня

вообщем вот есть тип int, 8 это int, и вот делегат это тип функции, тип описывающий [сигнатуру](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0) функции \
то есть функция:

```csharp
int add(int a,int b){return a+b;}
```

имеет "тип"&#x20;

```csharp
delegate int DelegateType(int a,int b);
```

и теперь любую другую функцию которая принимает 2 инта, и возвращает инт можно присвоить к этому делегату

\----------------

Делегаты  позволяют управлять частями кода как объектами([функции высшего порядка](https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D0%B2%D1%8B%D1%81%D1%88%D0%B5%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0), [объекты первого класса](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0)). Пример выше определяет новый тип под названием DelegateType, который представляет из себя метод, получающий целочисленную переменную (int) и не возвращающий значения. Любой метод, который соответствует этой сигнатуре может быть назначен переменной этого типа или передан как аргумент метода этого типа.

```csharp
delegate void DelegateType(int a);

void f1(int a) {
    stdout.printf("%d\n", a);
}

void f2(DelegateType d, int a) {
    d(a);       // Вызов делегата
}

void main() {
    f2(f1, 5);  // Передача метода как аргумент делегата другому методу
}
```

Этот код выполнит метод `f2`, передавая ссылку на метод `f1` и число 5. `f2` затем выполнит метод `f1`, передавая ему число.

Делегаты могут быть объявлены локально. Метод класса также может быть присвоен делегату, например:

```csharp
class Foo {

    public void f1(int a) {
        stdout.printf("a = %d\n", a);
    }

    delegate void DelegateType(int a);

    public static int main(string[] args) {
        Foo foo = new Foo();
        DelegateType d1 = foo.f1;
        d1(10);
        return 0;
    }
}
```
