Delegates And Multicast Delegates In C# Complete Guide

 Last Update:2025-06-23T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    7 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of Delegates and Multicast Delegates in C#

Delegates and Multicast Delegates in C#: An In-Depth Explanation

Understanding Delegates

A delegate in C# is a type that represents references to methods with a particular parameter list and return type. Delegates can be used to pass methods as parameters to other methods, store method references in variables, and defer method execution.

Syntax:

delegate ReturnType DelegateName(ParameterList);

Example:

delegate void MyDelegate(string message);

class Program
{
    static void Main()
    {
        MyDelegate del = new MyDelegate(SayHello);
        del("World");
    }

    static void SayHello(string name)
    {
        Console.WriteLine("Hello, " + name);
    }
}

In this example, MyDelegate is a delegate type that points to a method which takes a string as a parameter and returns void.

Key Points about Delegates:

  • Type Safety: Delegates ensure type safety by enforcing a method signature.
  • Multicast Support: A single delegate can invoke multiple methods (Multicast Delegates).
  • Anonymity: Delegates can reference anonymous methods, lambda expressions, and static methods.
  • Event Handling: Delegates are commonly used in event handling.

Multicast Delegates

A multicast delegate is a delegate that can reference multiple methods. When a multicast delegate is invoked, it will call all the methods it is pointing to in the order of their addition.

Creating and Using Multicast Delegates: To create a multicast delegate, simply combine multiple delegate instances using the + or += operators.

Example:

delegate void MyDelegate(string message);

class Program
{
    static void Main()
    {
        MyDelegate del = new MyDelegate(Greet);
        del += new MyDelegate(SayGoodbye);

        del("World"); // Invokes Greet and SayGoodbye
    }

    static void Greet(string name)
    {
        Console.WriteLine("Greetings, " + name);
    }

    static void SayGoodbye(string name)
    {
        Console.WriteLine("Goodbye, " + name);
    }
}

Key Points about Multicast Delegates:

  • Chaining Methods: You can chain multiple methods to a single delegate.
  • Order Matters: Methods are invoked in the order they are added.
  • Exception Handling: If one method in a multicast delegate throws an exception, subsequent methods will not be called.

Advanced Features and Best Practices

Lambda Expressions: Lambda expressions provide a more concise way to represent anonymous methods. They can be used wherever a delegate is expected.

Example:

MyDelegate del = (string msg) => { Console.WriteLine("Using Lambda: " + msg); };

Events and Delegates: Events in C# are based on delegates. They provide a mechanism for the publisher to notify subscribers about changes or actions.

Example:

public delegate void MyEventHandler(string message);

public class EventPublisher
{
    public event MyEventHandler OnEvent;
    public void TriggerEvent(string msg)
    {
        OnEvent?.Invoke(msg);
    }
}

class Program
{
    static void Main()
    {
        EventPublisher publisher = new EventPublisher();
        publisher.OnEvent += (string msg) => { Console.WriteLine("Message received: " + msg); };

        publisher.TriggerEvent("Hello from Event!");
    }
}

Best Practices:

  • Avoid Multicast Delegates in Performance-Critical Code: Invoking multiple methods can have performance implications.
  • Design Patterns: Use delegates to implement design patterns like Observer, Command, etc.
  • Error Handling: Implement try-catch blocks when working with delegates to prevent one method's failure from disrupting the entire method chain.

Conclusion

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement Delegates and Multicast Delegates in C#

Complete Examples, Step by Step for Beginners: Delegates and Multicast Delegates in C#

Let's go through this step-by-step with some examples.

Step 1: Understanding Delegates

First, we need to declare a delegate that represents the signature of the methods we want to assign.

using System;

public class Example
{
    // Step 1: Declare a delegate that matches the signature of the methods to be used
    public delegate void GreetingDelegate(string name);

    // Step 2: Define a method that matches the delegate's signature
    public static void Welcome(string name)
    {
        Console.WriteLine($"Hello, {name}!");
    }

    // Step 3: Define another method that matches the delegate's signature
    public static void Farewell(string name)
    {
        Console.WriteLine($"Goodbye, {name}!");
    }

    // Step 4: Use the delegate in the Main method
    public static void Main(string[] args)
    {
        // Step 4.1: Create an instance of the delegate and point it to a method
        GreetingDelegate greeting = Welcome;

        // Step 4.2: Invoke the delegate
        greeting("John");

        // Step 4.3: Point the delegate to another method
        greeting = Farewell;

        // Step 4.4: Invoke the delegate again
        greeting("John");
    }
}

Step 2: Using Multicast Delegates

Multicast delegates can hold references to more than one method. When a multicast delegate is invoked, all methods that are assigned to it are called in the order in which they were added.

using System;

public class Example
{
    // Step 1: Declare a delegate that matches the signature of the methods to be used
    public delegate void GreetingDelegate(string name);

    // Step 2: Define a method that matches the delegate's signature
    public static void Welcome(string name)
    {
        Console.WriteLine($"Hello, {name}!");
    }

    // Step 3: Define another method that matches the delegate's signature
    public static void Farewell(string name)
    {
        Console.WriteLine($"Goodbye, {name}!");
    }

    // Step 4: Define another method that matches the delegate's signature
    public static void GoodDay(string name)
    {
        Console.WriteLine($"Have a great day, {name}!");
    }

    // Step 5: Use the delegate in the Main method
    public static void Main(string[] args)
    {
        // Step 5.1: Create an instance of the delegate and point it to the first method
        GreetingDelegate greeting = Welcome;

        // Step 5.2: Combine the delegate with another method
        greeting += Farewell;

        // Step 5.3: Combine the delegate with yet another method
        greeting += GoodDay;

        // Step 5.4: Invoke the delegate
        greeting("John");

        // Step 5.5: Remove a method from the delegate
        greeting -= Farewell;

        // Step 5.6: Invoke the delegate again
        greeting("John");
    }
}

Explanation:

  1. Declare a Delegate:

    public delegate void GreetingDelegate(string name);
    

    This line declares a delegate named GreetingDelegate that can point to any method that takes a string parameter and returns void.

  2. Define Methods:

    public static void Welcome(string name)
    {
        Console.WriteLine($"Hello, {name}!");
    }
    
    public static void Farewell(string name)
    {
        Console.WriteLine($"Goodbye, {name}!");
    }
    
    public static void GoodDay(string name)
    {
        Console.WriteLine($"Have a great day, {name}!");
    }
    

    These methods match the signature of the GreetingDelegate.

  3. Create and Use Delegates:

    GreetingDelegate greeting = Welcome;
    greeting("John"); // Invokes Welcome
    

    This creates a delegate greeting that points to the Welcome method and invokes it with the argument "John".

  4. Multicast Delegates:

    greeting += Farewell;
    greeting += GoodDay;
    greeting("John"); // Invokes Welcome, Farewell, and GoodDay
    

    The += operator adds methods to the multicast delegate, and all assigned methods are invoked in the order they were added.

  5. Removing Methods from Multicast Delegates:

    greeting -= Farewell;
    greeting("John"); // Invokes Welcome and GoodDay
    

    The -= operator removes a method from the multicast delegate.

Top 10 Interview Questions & Answers on Delegates and Multicast Delegates in C#

1. What are delegates in C#?

Answer: Delegates in C# are similar to function pointers in other languages. They hold references to methods and can be passed as parameters. Here, Func and Action are predefined generic delegates:

public delegate void Print(string message);
public class Program {
    public static void Main() {
        Print printDelegate = Console.WriteLine;
        printDelegate("Hello!");
    }
}

2. How do you declare and invoke a delegate in C#?

Answer: Declaring a delegate involves specifying the return type and parameter list of the methods it will reference. Invoking it is simply calling the delegate like a method.

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

public class Program {
    static int Sum(int a, int b) {
        return a + b;
    }

    public static void Main() {
        AddNumbers myDelegate = new AddNumbers(Sum); // Declaration
        int result = myDelegate(5, 3);              // Invocation
        Console.WriteLine(result);                    // Output: 8
    }
}

3. Can you explain predefined delegates in C#?

Answer: Yes, C# includes predefined delegates such as Action, Func, Predicate, EventHandler, and PropertyChangedEventHandler. Action<T> accepts parameters but doesn't return anything, whereas Func<T, TResult> takes parameters and returns a value. For example, using Action and Func:

using System;

class Program {
    public static void Main() {
        Action<string> greetDelegate = (name) => Console.WriteLine($"Hello {name}!");
        greetDelegate("Alice");

        Func<int, int, int> addDelegate = (a, b) => a + b;
        int sum = addDelegate(4, 6);
        Console.WriteLine(sum);
    }
}

4. What are multicast delegates in C#?

Answer: Multicast delegates allow multiple methods to be invoked when the delegate is called. A multicast delegate combines multiple instances of single-cast delegates into one delegate instance using the + operator.

public delegate void Notify(string message);

public class NotificationSystem {
    public Notify NotifyEvent;

    public void TriggerNotification() {
        NotifyEvent?.Invoke("Notifications Triggered!");
    }
}

public class Program {
    public static void HandleNotification1(string message) {
        Console.WriteLine("Handler 1 received: " + message);
    }

    public static void HandleNotification2(string message) {
        Console.WriteLine("Handler 2 received: " + message);
    }

    public static void Main() {
        var system = new NotificationSystem();
        system.NotifyEvent += HandleNotification1;
        system.NotifyEvent += HandleNotification2;
        system.TriggerNotification();
    }
}

5. How do you remove methods from multicast delegates?

Answer: Methods can be removed from multicast delegates using the -= operator. Only the specified method will be unsubscribed, not all.

public static void Main() {
    var system = new NotificationSystem();
    system.NotifyEvent += HandleNotification1;
    system.NotifyEvent += HandleNotification2;
    system.NotifyEvent -= HandleNotification1; // HandleNotification1 is unsubscribed
    system.TriggerNotification();               // Handler 2 only receives notification
}

6. Can delegates be used with anonymous methods?

Answer: Yes, delegates can reference anonymous methods – blocks of code that do not have a name and can be defined directly where they are used.

public static void Main() {
    Notify anonMethod = delegate(string msg) {
        Console.WriteLine("Anonymous method received message: " + msg);
    };

    anonMethod("Hello via Anonymous Method!");
}

7. How do you use lambdas with delegates?

Answer: Lambda expressions provide a more concise syntax for inline anonymous methods. They are often used with predefined generic delegates like Func<T, TResult> and Action.

public static void Main() {
    Notify lambdaMethod = (msg) => Console.WriteLine(msg);
    lambdaMethod("Greetings from Lambda!");

    Func<int, int> square = x => x * x;
    Console.WriteLine(square(3)); // Output: 9
}

8. Can delegates be used for asynchronous programming in C#?

Answer: Yes, delegates can be used for executing methods asynchronously through methods like BeginInvoke() and EndInvoke(). However, these are less common in modern asynchronous programming, which typically uses async/await.

9. How do delegates differ from interfaces in C#?

Answer: Delegates refer to methods by their signature, while interfaces define contracts for classes or structs. Delegates can encapsulate only a reference to a single method or a list of methods via multicast delegates, whereas interfaces can contain multiple methods, properties, events.

public interface IGreeting {
    void Greet(string name);
}

// Implementing an interface
public class FormalGreeting : IGreeting {
    public void Greet(string name) {
        Console.WriteLine("Good day, " + name);
    }
}

public class Program {
    public static void Main() {
        Notify del = new Notify(FormalGreeting.Greet);
        del("Bob");
    }
}

10. What are common use cases for delegates and multicast delegates in C#?

Answer: Delegates are commonly used for:

  • Event handling
  • Asynchronous method calls
  • Callback mechanisms
  • Defining method invocation parameters

Multicast delegates are particularly useful in scenarios where you need to notify multiple subscribers of an event, such as:

  • Publishing/Subscriber patterns
  • Logging frameworks where a logging event might be handled by multiple loggers

You May Like This Related .NET Topic

Login to post a comment.