A Complete Guide - Delegates and Multicast Delegates in C#

Last Updated: 03 Jul, 2025   
  YOU NEED ANY HELP? THEN SELECT ANY TEXT.

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.

 YOU NEED ANY HELP? THEN SELECT ANY TEXT.

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.