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