C# > Advanced C# > Delegates and Events > Delegates Declaration and Usage
Basic Delegate Declaration and Usage
This snippet demonstrates the fundamental declaration and usage of delegates in C#. Delegates are type-safe function pointers that allow you to pass methods as arguments to other methods, store them in data structures, and invoke them later. This example showcases a simple delegate that encapsulates a method taking an integer and returning a string.
Delegate Declaration
This line declares a delegate type named `StringConverter`. This delegate can reference any method that takes an integer as input and returns a string. Think of it as defining a 'contract' for methods that can be assigned to this delegate.
public delegate string StringConverter(int input);
Method Implementation
Here, we define a method called `IntToString` that matches the signature defined by the `StringConverter` delegate (takes an `int`, returns a `string`). This method will be the target of our delegate.
public static string IntToString(int number)
{
return "Number: " + number.ToString();
}
Delegate Instantiation and Invocation
This section shows how to create an instance of the `StringConverter` delegate, assigning the `IntToString` method to it. Then, we invoke the delegate like a regular method, and it executes the underlying `IntToString` method. The output displays the result of the method call.
StringConverter converter = new StringConverter(IntToString);
string result = converter(10);
Console.WriteLine(result); // Output: Number: 10
Complete Code Example
This is the full compilable code example, demonstrating the delegate declaration, method implementation, and delegate instantiation and invocation within a `Main` method.
using System;
public delegate string StringConverter(int input);
public class DelegateExample
{
public static string IntToString(int number)
{
return "Number: " + number.ToString();
}
public static void Main(string[] args)
{
StringConverter converter = new StringConverter(IntToString);
string result = converter(10);
Console.WriteLine(result);
}
}
Concepts Behind the Snippet
Delegates provide a mechanism for creating loosely coupled applications. The code using the delegate doesn't need to know the concrete method being executed; it only needs to know that the method adheres to the delegate's signature. This is a core concept in event-driven programming.
Real-Life Use Case
A common use case for delegates is in UI frameworks. For example, a button click event uses a delegate to notify subscribers (event handlers) when the button is clicked. The button doesn't need to know what the subscribers will *do* when clicked; it simply invokes the delegate.
Best Practices
Interview Tip
Be prepared to explain the difference between delegates and events. Delegates are a *type*, while events are a *mechanism* built on top of delegates to provide controlled access to delegate invocation lists. Events prevent arbitrary modification of the invocation list by outside classes.
When to Use Them
Use delegates when you need to pass a method as an argument to another method, implement callback mechanisms, or create event-driven systems. They are particularly useful when you want to decouple the caller from the specific implementation being executed.
Memory Footprint
The memory footprint of a delegate is relatively small. It primarily stores a reference to the target method and, if it's an instance method, a reference to the target object. However, creating *many* delegates can contribute to increased memory usage.
Alternatives
Alternatives to delegates include interfaces and abstract classes. However, delegates provide more flexibility when dealing with method signatures directly, without requiring a common base class or interface implementation.
Pros
Cons
FAQ
-
What is the difference between a delegate and an event?
A delegate is a type that represents a reference to a method. An event is a mechanism that allows classes to notify other classes when something of interest happens. Events are built on top of delegates and provide a controlled way to manage delegate invocation lists. -
Can I use delegates with lambda expressions?
Yes, lambda expressions are a concise way to create anonymous methods that can be assigned to delegates. This makes delegate usage more readable and efficient, especially for simple operations.