Delegates in C#: Creating flexible code


2 min read

Have you ever wondered how to link two different methods that have nothing in common, or wanted to change a method's behavior without modifying its code? If so, you have likely encountered the term "delegate" in the context of C# programming. Delegates are one of the most powerful tools in a C# programmer's arsenal, yet their full potential often goes untapped. In this post, we will discuss what delegates are, how to use them, and how they can simplify and enhance our work.

What Are Delegates in C#?

A delegate is a type that safely encapsulates a reference to a method. In other words, a delegate is a function pointer. This means that using delegates, we can create a variable, assign a method to it, and then call that method through the variable. This grants us significant flexibility. For instance, we can define a method that takes a delegate as an argument and, depending on the method passed, it can behave in many different ways.

Example of Using Delegates

Let's say we are creating an application with various tabs, e.g., in the main MainWindow class, we have a tab called FirstTab. We want something to happen in MainWindow when a button in FirstTab is clicked. How can we achieve this?

The first step is to define a delegate. For example:

public delegate void Action();

Next, in the FirstTab class, we can define an event that uses this delegate:

public class FirstTab
    public event Action ButtonClicked;
    public void OnButtonClicked()

In the MainWindow class, we can now subscribe to this event and define what should happen when it occurs:

public class MainWindow
    private FirstTab firstTab = new FirstTab();
    public MainWindow()
        firstTab.ButtonClicked += ReactToButtonClicked;
    private void ReactToButtonClicked()
        // Code to execute when the button is clicked.

This way, using delegates, we have created a mechanism that allows communication between two classes that otherwise would have no knowledge of each other.


Delegates are a powerful tool that allows for the creation of flexible and easily extensible code. With delegates, methods can become first-class citizens in our code, enabling architectures that wouldn't be possible without this mechanism.

One of the biggest advantages of delegates is that they allow the definition of events, which are the cornerstone of event-driven programming, popular in desktop, web, and mobile applications.

Remember that, like any tool, delegates should be used judiciously and where they are truly needed. Overcomplicating code can lead to maintenance and scalability issues. However, when used wisely, delegates can bring incredible benefits and are definitely worth having in your programming toolkit.