55 lines
3.9 KiB
Markdown
55 lines
3.9 KiB
Markdown
|
---
|
|||
|
title: Delegates
|
|||
|
localeTitle: Делегаты
|
|||
|
---
|
|||
|
## Делегаты
|
|||
|
|
|||
|
AC # делегат представляет ссылку на метод, который имеет заданный набор параметров и заданного типа возврата. Когда вы создаете экземпляр делегата, вы можете связать его с любой метод, совместимый с типом делегирования: имеет одинаковое количество параметров, каждое из которых тот же тип, и тип возвращаемого значения также одинаков.
|
|||
|
|
|||
|
Вы можете использовать метод экземпляра или статический метод, когда назначаете его делегату.
|
|||
|
|
|||
|
Делегат позволяет передавать методы как параметры другим методам.
|
|||
|
|
|||
|
Делегаты часто используются для реализации функций обратного вызова. Наиболее типичным примером являются обработчики событий: вы регистрируете метод, который должен вызываться всякий раз, когда происходит определенное событие (например, нажата кнопка мыши).
|
|||
|
|
|||
|
### Краткое описание для разработчиков
|
|||
|
|
|||
|
Делегаты похожи на указатели функций на языках типа C, таких как C или C ++. Однако они безопасны по типу. В отличие от простых указателей функций они содержат информацию об экземпляре объекта, метод которого будет вызываться при вызове делегата, и строгие проверки типов для аргументов и возвращаемое значение функции.
|
|||
|
|
|||
|
## пример
|
|||
|
|
|||
|
Вы объявляете делегата похожим на то, как вы объявляете функцию, но добавляете ключевое слово `delegate` . Например:
|
|||
|
|
|||
|
```csharp
|
|||
|
public delegate string StringOperation ( string s1, string s2 );
|
|||
|
```
|
|||
|
|
|||
|
Любой метод, который принимает два `string` аргумента и возвращает `string` может быть назначен переменной этого типа делегата.
|
|||
|
|
|||
|
После того, как вы создали тип делегата, вы можете использовать его так же, как и любой другой тип. Вы можете объявить локальную переменную, других членов класса или передать их в качестве параметров другим методам.
|
|||
|
|
|||
|
```csharp
|
|||
|
StringOperation a;
|
|||
|
```
|
|||
|
|
|||
|
Перед вызовом делегата вам нужно будет присвоить ему значение. Предположим, что у нас есть метод конкатенации который имеет следующую реализацию:
|
|||
|
|
|||
|
```csharp
|
|||
|
private string Concatenate ( string one, string two ) {
|
|||
|
return one + " " + two;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Затем вы можете назначить это переменной делегата и вызвать ее как функцию.
|
|||
|
|
|||
|
```csharp
|
|||
|
StringOperation op = Concatenate;
|
|||
|
|
|||
|
string result = op("Hello", "World");
|
|||
|
|
|||
|
Console.WriteLine ( result ); // print "Hello World" to the console
|
|||
|
```
|
|||
|
|
|||
|
## Больше информации
|
|||
|
|
|||
|
Подробнее о делегатах читайте [здесь](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/delegates/) .
|