What if your program could call you back exactly when it's ready, without you waiting or checking?
Why Delegates as callback pattern in C Sharp (C#)? - Purpose & Use Cases
Imagine you are building a program that needs to perform a task, then notify you when it's done. Without delegates, you might write separate code for each notification, making your program bulky and hard to change.
Manually checking if a task is done or writing many specific methods for each notification is slow and error-prone. It's like having to call each friend individually to tell them the same news instead of sending one message that everyone can get.
Delegates let you pass a method as a parameter, so your program can call back any function you want when a task finishes. This makes your code cleaner, flexible, and easy to update--like sending one message that automatically reaches the right people.
void TaskDone() { NotifyUser(); LogCompletion(); }
void NotifyUser() { /* code */ }
void LogCompletion() { /* code */ }delegate void Callback();
void DoTask(Callback cb) { /* work */ cb(); }
DoTask(() => Console.WriteLine("Task finished!"));It enables your program to flexibly react to events by calling different methods without changing the main task code.
Think of ordering food delivery: you place an order (task), then get a call, text, or app notification (callback) when it arrives, depending on your preference.
Manual notification methods are rigid and repetitive.
Delegates let you pass methods as parameters for flexible callbacks.
This pattern keeps code clean and easy to update.
Practice
Solution
Step 1: Understand delegate usage
Delegates allow methods to be passed as parameters to other methods.Step 2: Identify callback purpose
This passing enables callbacks, which run code after some work is done.Final Answer:
To pass methods as parameters and execute them later -> Option CQuick Check:
Delegates = method parameters for callbacks [OK]
- Confusing delegates with classes
- Thinking delegates handle exceptions
- Assuming delegates convert data types
Solution
Step 1: Recall delegate declaration syntax
The correct syntax is: delegate returnType DelegateName(parameterList);Step 2: Match syntax to options
delegate void MyDelegate(int number); matches this pattern: delegate void MyDelegate(int number);Final Answer:
delegate void MyDelegate(int number); -> Option DQuick Check:
delegate returnType Name(params) = delegate void MyDelegate(int number); [OK]
- Placing 'void' before 'delegate'
- Swapping delegate and return type order
- Misplacing delegate keyword after name
delegate void Callback(string message);
class Program {
static void Main() {
Callback cb = msg => Console.WriteLine($"Hello, {msg}!");
RunProcess(cb);
}
static void RunProcess(Callback callback) {
Console.WriteLine("Starting process...");
callback("World");
Console.WriteLine("Process finished.");
}
}Solution
Step 1: Trace method calls in Main and RunProcess
Main creates a callback that prints "Hello, {msg}!" and passes it to RunProcess. RunProcess prints "Starting process...", calls callback with "World", then prints "Process finished.".Step 2: Determine output order
Output lines are: "Starting process...", "Hello, World!", "Process finished." in that order.Final Answer:
Starting process... Hello, World! Process finished. -> Option AQuick Check:
Callback runs between start and finish prints [OK]
- Assuming callback runs before 'Starting process...'
- Mixing output order
- Ignoring lambda execution timing
delegate void Notify();
class Test {
static void Main() {
Notify n = NotifyMethod;
Run(n);
}
static void Run(Notify callback) {
callback();
}
static void NotifyMethod(string message) {
Console.WriteLine(message);
}
}Solution
Step 1: Compare delegate and method signatures
Delegate Notify expects a method with no parameters and void return. NotifyMethod takes a string parameter, so signatures differ.Step 2: Understand delegate assignment rules
Assigning NotifyMethod to Notify delegate causes a compile-time error due to signature mismatch.Final Answer:
Delegate signature does not match method signature -> Option BQuick Check:
Delegate and method signatures must match [OK]
- Ignoring parameter mismatch
- Thinking delegate instantiation is wrong
- Assuming missing return causes error here
ProcessData that takes an integer array and a delegate callback to process each element asynchronously. Which approach correctly uses delegates as callbacks to print each element after processing?Solution
Step 1: Identify delegate type for element processing
Since each element is an int and we want to process it,Action<int>fits as it takes int and returns void.Step 2: Use asynchronous calls inside loop
CallingTask.Run(() => callback(item))runs the callback asynchronously for each element.Final Answer:
Define a delegateAction<int>and call it inside a loop withTask.Run(() => callback(item))-> Option AQuick Check:
Delegate matches parameter and async call runs callback per item [OK]
- Using delegate with wrong parameters
- Calling callback only once instead of per item
- Ignoring async execution
Ready to prove it?
Pass the test and this pattern moves unknown
