C# - Delegates: A Friendly Guide for Beginners

Hello there, future coding superstar! Today, we're going to dive into the fascinating world of C# delegates. Don't worry if you've never heard of them before – by the end of this tutorial, you'll be a delegate pro! Let's embark on this exciting journey together.

C# - Delegates

What Are Delegates?

Imagine you're organizing a party, and you need someone to handle the music. Instead of doing it yourself, you delegate this task to your friend who's a DJ. In C#, delegates work similarly – they're like little messengers that can hold and invoke methods for us.

In simpler terms, a delegate is a type that represents references to methods with a particular parameter list and return type. Think of it as a blueprint for a method.

Declaring Delegates

Let's start by learning how to declare a delegate. The syntax is quite simple:

public delegate void SimpleDelegate();

This declares a delegate named SimpleDelegate that can reference methods that take no parameters and return nothing (void).

Here's another example:

public delegate int MathDelegate(int x, int y);

This MathDelegate can reference any method that takes two integers and returns an integer.

Instantiating Delegates

Now that we've declared our delegates, let's see how to use them. We'll start by creating a method that matches our delegate's signature:

public static void SayHello()
{
    Console.WriteLine("Hello, Delegates!");
}

// Instantiating the delegate
SimpleDelegate greet = new SimpleDelegate(SayHello);

// Invoking the delegate
greet();

When we run this code, it will output: "Hello, Delegates!"

Let's break it down:

  1. We defined a method SayHello that matches our SimpleDelegate signature.
  2. We created an instance of SimpleDelegate and assigned it the SayHello method.
  3. We invoked the delegate using greet(), which in turn called SayHello.

Multicasting of a Delegate

Now, here's where delegates get really cool. They can hold references to multiple methods! This is called multicasting. Let's see it in action:

public static void SayHello() { Console.WriteLine("Hello"); }
public static void SayGoodbye() { Console.WriteLine("Goodbye"); }

SimpleDelegate greetings = SayHello;
greetings += SayGoodbye;

greetings(); // This will call both SayHello and SayGoodbye

Output:

Hello
Goodbye

Isn't that neat? We've added two methods to our delegate, and when we invoke it, both methods are called in the order they were added.

Using Delegates

Delegates are incredibly useful in many scenarios. One common use is in event handling. Let's look at a simple example:

public delegate void TemperatureChangedHandler(float newTemperature);

class Thermostat
{
    private float _temperature;
    public event TemperatureChangedHandler TemperatureChanged;

    public float Temperature
    {
        get { return _temperature; }
        set 
        { 
            if (_temperature != value)
            {
                _temperature = value;
                OnTemperatureChanged();
            }
        }
    }

    protected virtual void OnTemperatureChanged()
    {
        if (TemperatureChanged != null)
        {
            TemperatureChanged(_temperature);
        }
    }
}

class Program
{
    static void Main()
    {
        Thermostat thermostat = new Thermostat();
        thermostat.TemperatureChanged += HandleTemperatureChange;

        thermostat.Temperature = 25.5f;
    }

    static void HandleTemperatureChange(float newTemperature)
    {
        Console.WriteLine($"Temperature changed to {newTemperature}°C");
    }
}

In this example, we've created a Thermostat class that uses a delegate to notify when the temperature changes. The Main method subscribes to this event, and when the temperature is set, it triggers the HandleTemperatureChange method.

Delegate Methods

Here's a table of some common delegate-related methods:

Method Description
Invoke Calls the methods that the delegate is holding
BeginInvoke Begins an asynchronous invocation of the delegate
EndInvoke Ends an asynchronous invocation of the delegate
GetInvocationList Returns an array of delegates representing the invocation list

Conclusion

Congratulations! You've just taken your first steps into the world of C# delegates. We've covered declaring delegates, instantiating them, multicasting, and even seen a practical example with event handling.

Remember, delegates might seem a bit abstract at first, but they're incredibly powerful tools in C#. They allow for flexible and loosely-coupled designs, especially when it comes to event-driven programming.

As you continue your C# journey, you'll find more and more uses for delegates. They're like Swiss Army knives in your coding toolkit – versatile and always handy when you need them.

Keep practicing, stay curious, and before you know it, you'll be delegating tasks to your code like a pro! Happy coding!

Credits: Image by storyset