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); // 8Built-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); // trueEvents
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);
}
}
}
}