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