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