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/) . |