Skip to content

C# Delegates and Events

Overview

Delegates are type-safe function pointers that allow methods to be passed as parameters. Events are based on delegates and provide a publish-subscribe mechanism.

Delegates

Basic Delegate

csharp
public delegate void SimpleDelegate(string message);

public class DelegateExample
{
    public static void ShowMessage(string message)
    {
        Console.WriteLine($"Message: {message}");
    }
    
    public static void ShowError(string message)
    {
        Console.WriteLine($"Error: {message}");
    }
}

// Usage
SimpleDelegate del = new SimpleDelegate(DelegateExample.ShowMessage);
del("Hello World!");

// Multicast delegate
del += DelegateExample.ShowError;
del("Test message");

Generic Delegates

csharp
public delegate T Operation<T>(T a, T b);

public class MathOperations
{
    public static int Add(int a, int b) => a + b;
    public static int Multiply(int a, int b) => a * b;
}

// Usage
Operation<int> mathOp = MathOperations.Add;
int result = mathOp(5, 3); // 8

Built-in Delegates

csharp
// Func delegate (with return value)
Func<int, int, int> add = (a, b) => a + b;
int sum = add(5, 3); // 8

// Action delegate (no return value)
Action<string> print = message => Console.WriteLine(message);
print("Hello!");

// Predicate delegate (returns bool)
Predicate<int> isEven = number => number % 2 == 0;
bool even = isEven(4); // true

Events

Basic Event

csharp
public class Publisher
{
    public event Action<string> OnMessage;
    
    public void SendMessage(string message)
    {
        OnMessage?.Invoke(message);
    }
}

public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        publisher.OnMessage += HandleMessage;
    }
    
    private void HandleMessage(string message)
    {
        Console.WriteLine($"Received: {message}");
    }
}

Custom Event Args

csharp
public class MessageEventArgs : EventArgs
{
    public string Message { get; }
    public DateTime Timestamp { get; }
    
    public MessageEventArgs(string message)
    {
        Message = message;
        Timestamp = DateTime.Now;
    }
}

public class AdvancedPublisher
{
    public event EventHandler<MessageEventArgs> OnAdvancedMessage;
    
    public void SendAdvancedMessage(string message)
    {
        OnAdvancedMessage?.Invoke(this, new MessageEventArgs(message));
    }
}

Practical Examples

Button Click Event

csharp
public class Button
{
    public event EventHandler Click;
    
    public void SimulateClick()
    {
        Click?.Invoke(this, EventArgs.Empty);
    }
}

public class ButtonHandler
{
    public void HandleClick(object sender, EventArgs e)
    {
        Console.WriteLine("Button was clicked!");
    }
}

Temperature Monitor

csharp
public class TemperatureMonitor
{
    public event Action<double> TemperatureChanged;
    
    private double _temperature;
    
    public double Temperature
    {
        get => _temperature;
        set
        {
            if (_temperature != value)
            {
                _temperature = value;
                TemperatureChanged?.Invoke(value);
            }
        }
    }
}

Content is for learning and research only.