Sobes.tech
Junior

Tell about delegates in C# programming language.

sobes.tech AI

Answer from AI

Delegates are type-safe references to methods in C#. They allow passing methods as arguments, assigning them to variables, and invoking them later.

Main properties:

  • Type safety: A delegate can only reference methods with a specific signature (return type and parameter types).
  • Multicast: A single delegate can point to multiple methods. When the delegate is invoked, all referenced methods are executed.

Example of declaration and usage:

// Delegate declaration
public delegate void MyDelegate(string message);

// Method matching the delegate signature
public void ShowMessage(string msg)
{
    Console.WriteLine(msg);
}

// Using the delegate
MyDelegate delegateInstance = new MyDelegate(ShowMessage);
delegateInstance("Hello, world!"); // Call method via delegate

Interaction with events:

Events in C# are built on delegates. They provide a mechanism for subscribing and unsubscribing from notifications.

// Declaring an event using a delegate
public event MyDelegate SomethingHappened;

// Raising the event (notifying subscribers)
public void TriggerEvent(string data)
{
    SomethingHappened?.Invoke(data); // Safe event invocation
}

Standard delegate types:

C# provides predefined generic delegate types for convenience:

  • Action<T1, ... Tn>: A delegate that does not return a value.
  • Func<T1, ... Tn, TResult>: A delegate that returns a value of type TResult.
  • Predicate<T>: A delegate that takes an argument of type T and returns a bool.

Example with Func:

// Declaring a Func delegate
Func<int, int, int> add = (a, b) => a + b;

// Using the Func delegate
int result = add(5, 3); // result = 8

Delegates are actively used in:

  • Callbacks: To notify the caller about the completion of an asynchronous operation or event.
  • Event handlers: To react to events in applications with graphical interfaces or other systems.
  • Parallel programming: To pass tasks to worker threads.
  • LINQ: Many LINQ operators use delegates (via lambda expressions).

Connection with lambda expressions and anonymous methods:

Lambda expressions and anonymous methods are syntactic sugar for creating delegate instances. They allow defining methods "on the fly" without explicit declaration.