Hey! If you love C# and building C# apps as much as I do, let's connect on Twitter or LinkedIn. I talk about this stuff all the time!

Delegates in C#

Unlock the power of delegates in C#! Learn how to use these versatile tools to simplify your code and improve its flexibility. Discover the ins and outs of delegate definitions, event handling, and more!


Updated October 18, 2023

In C#, delegates are a powerful tool for passing methods as arguments to other methods or properties. They allow you to decouple the invocation of a method from its definition, making your code more flexible and modular. In this article, we’ll explore what delegates are, how they work, and some common use cases for them.

What is a delegate?

A delegate is simply a reference to a method. It’s like a button that says “Call me!” and has a list of methods that can be called when the button is pressed. When you pass a delegate as an argument to a method, it tells the method which method to call and when.

Here’s an example of how to define a delegate:

public delegate void MyDelegate(string message);

This defines a delegate called MyDelegate that takes a string argument named message.

How do delegates work?

To use a delegate, you first need to create an instance of it. This is done by calling the Delegate.CreateInstance() method and passing in the type of the delegate and any required arguments. Here’s an example:

MyDelegate del = Delegate.CreateInstance(typeof(MyDelegate), new object[] { "Hello" });

This creates a new instance of the MyDelegate delegate with the message “Hello”.

Now that you have an instance of the delegate, you can pass it as an argument to a method that takes a delegate as a parameter. Here’s an example:

public void InvokeDelegate(MyDelegate del)
{
    del("Goodbye");
}

This method takes a MyDelegate parameter named del and calls the del method with the message “Goodbye”.

Use cases for delegates

Delegates are useful in a variety of situations, such as:

Event handling

You can use delegates to handle events. For example, you might have a button that clicks an event handler when it’s clicked. You can pass the event handler as a delegate to the button’s Click event property:

public void Button_Click(object sender, MyDelegate e)
{
    e("Button clicked!");
}

myButton.Click += new MyDelegate(Button_Click);

This defines an event handler called Button_Click that takes a string argument named message. The myButton button has its Click event set to call the Button_Click method with the message “Button clicked!”.

Method chaining

You can use delegates to chain methods together. For example, you might have a method that performs some logic and then calls another method:

public void DoSomething()
{
    MyDelegate del = new MyDelegate(DoSomethingElse);
    del("Hello");
}

public void DoSomethingElse(string message)
{
    Console.WriteLine(message);
}

This defines a method called DoSomething that creates a new instance of the MyDelegate delegate with the DoSomethingElse method as its implementation. It then calls the DoSomething Else method with the message “Hello”.

Conclusion

Delegates are a powerful tool for passing methods as arguments to other methods or properties in C#. They allow you to decouple the invocation of a method from its definition, making your code more flexible and modular. With delegates, you can handle events, chain methods together, and much more.