64 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								title: Delegates
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								## Delegates
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A C# delegate represents a reference to a method that has a given set 
							 | 
						||
| 
								 | 
							
								of parameters and a given return type. When you instantiate the delegate, you can associate it with
							 | 
						||
| 
								 | 
							
								any method that is compatible with the delegate type: has the same amount of parameters, each is of the
							 | 
						||
| 
								 | 
							
								same type and the type of the return value is also the same.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can either use an instance method or a static method when you assign it to a delegate.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Delegate allow you to pass methods as parameters to other methods. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Delegates are often used to implement callback functions. The most typical example are event handlers: you register
							 | 
						||
| 
								 | 
							
								a method that is to be called whenever a certain event happens (the mouse button is clicked, for example).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Short explanation for developers
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Delegates are like function pointers in C type languages like C or C++. However, they are type safe. 
							 | 
						||
| 
								 | 
							
								Unlike simple function pointers they 
							 | 
						||
| 
								 | 
							
								contain information about the object instance whose method will be called when invoking the delegate, and have
							 | 
						||
| 
								 | 
							
								strict type checks for the arguments and return value of the function.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Example
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You declare a delegate similar to how you declare a function, but add the `delegate` keyword. For example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```csharp
							 | 
						||
| 
								 | 
							
								    public delegate string StringOperation ( string s1, string s2 );
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Any method that takes two `string` arguments and returns `string` can be assigned to a variable of this delegate type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								After you have created the delegate type, you can use it just like any other type. You can declare a local variable, 
							 | 
						||
| 
								 | 
							
								other class members or pass them as parameters to other methods.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```csharp
							 | 
						||
| 
								 | 
							
								    StringOperation a;
							 | 
						||
| 
								 | 
							
								```    
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Before invoking the delegate, you will need to assign a value to it. Let's assume we have a concatenation method 
							 | 
						||
| 
								 | 
							
								that has the following implementation:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```csharp
							 | 
						||
| 
								 | 
							
								    private string Concatenate ( string one, string two ) {
							 | 
						||
| 
								 | 
							
								        return one + " " + two;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								```    
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can then assign this to the delegate variable and invoke it like a function.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```csharp
							 | 
						||
| 
								 | 
							
								    StringOperation op = Concatenate;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    string result = op("Hello", "World");
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    Console.WriteLine ( result ); // print "Hello World" to the console
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## More information
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Read more about delegates [here](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/delegates/).
							 |