📖 Scenario: Imagine you are building a simple notification system where different parts of a program can listen for messages and react when something important happens.
🎯 Goal: You will create a basic publisher-subscriber model in C#. The publisher will send messages, and subscribers will receive and display those messages.
📋 What You'll Learn
Create a delegate type for the event
Create a publisher class with an event
Create subscriber classes with methods to handle the event
Subscribe the subscriber methods to the publisher's event
Trigger the event to notify all subscribers
Print the messages received by subscribers
💡 Why This Matters
🌍 Real World
Publisher-subscriber models are used in chat apps, notification systems, and event-driven programming to let parts of a program talk to each other easily.
💼 Career
Understanding events and delegates in C# is essential for building responsive applications and working with frameworks like .NET that use event-driven designs.
Progress0 / 4 steps
1
Create a delegate and a publisher class with an event
Create a delegate called MessageHandler that takes a string parameter. Then create a class called Publisher with an event called MessageSent of type MessageHandler.
C Sharp (C#)
Hint
Delegates define the shape of methods that can be called. Events use delegates to notify subscribers.
2
Add a method in Publisher to send messages
In the Publisher class, add a method called SendMessage that takes a string parameter called message. Inside this method, invoke the MessageSent event with the message if it is not null.
C Sharp (C#)
Hint
Check if the event has subscribers before calling it to avoid errors.
3
Create subscriber classes with methods to handle messages
Create two classes called SubscriberA and SubscriberB. Each class should have a method called OnMessageReceived that takes a string parameter called message and prints "Subscriber A received: {message}" or "Subscriber B received: {message}" respectively.
C Sharp (C#)
Hint
Use System.Console.WriteLine with string interpolation to print messages.
4
Subscribe methods and send a message
In the Main method, create instances of Publisher, SubscriberA, and SubscriberB. Subscribe SubscriberA.OnMessageReceived and SubscriberB.OnMessageReceived to the Publisher.MessageSent event. Then call SendMessage on the publisher with the message "Hello Subscribers!". Print the output.
C Sharp (C#)
Hint
Use the += operator to subscribe methods to events.
Practice
(1/5)
1. In the publisher-subscriber model in C#, what is the main role of the subscriber?
easy
A. To send messages to multiple listeners
B. To register methods that respond to events from the publisher
C. To create new events for the publisher
D. To directly modify the publisher's data
Solution
Step 1: Understand the roles in the model
The publisher sends messages or events, while the subscriber listens and reacts.
Step 2: Identify subscriber's responsibility
Subscribers register their methods to handle events raised by the publisher.
Final Answer:
To register methods that respond to events from the publisher -> Option B
Quick Check:
Subscriber = method registration [OK]
Hint: Subscribers listen and react by registering methods [OK]
Common Mistakes:
Confusing publisher and subscriber roles
Thinking subscriber sends messages
Assuming subscriber modifies publisher directly
2. Which of the following is the correct syntax to subscribe a method named OnDataReceived to an event DataReceived in C#?
easy
A. DataReceived += OnDataReceived;
B. DataReceived = OnDataReceived();
C. DataReceived -= OnDataReceived;
D. OnDataReceived += DataReceived;
Solution
Step 1: Recall event subscription syntax
In C#, subscribing to an event uses the += operator with the method name (without parentheses).
Step 2: Match correct syntax
DataReceived += OnDataReceived; correctly subscribes the method.
Final Answer:
DataReceived += OnDataReceived; -> Option A
Quick Check:
Subscribe event = += method [OK]
Hint: Use += to subscribe methods to events [OK]
Common Mistakes:
Using = instead of +=
Calling method with parentheses when subscribing
Confusing subscription with unsubscription (-=)
3. Consider the following C# code snippet:
public class Publisher {
public event Action Notify;
public void Raise() {
Notify?.Invoke();
}
}
public class Subscriber {
public void Respond() {
Console.WriteLine("Event received");
}
}
var pub = new Publisher();
var sub = new Subscriber();
pub.Notify += sub.Respond;
pub.Raise();
What will be the output when pub.Raise() is called?
medium
A. No output
B. NullReferenceException
C. Event received
D. Compile-time error
Solution
Step 1: Understand event subscription and invocation
The subscriber's Respond method is subscribed to the Notify event, so it will be called when Raise() invokes Notify.
Step 2: Analyze output of Respond method
Respond prints "Event received" to the console, so this text will appear.
Final Answer:
Event received -> Option C
Quick Check:
Subscribed method runs and prints message [OK]
Hint: Subscribed methods run on event invoke [OK]
Common Mistakes:
Forgetting to subscribe the method
Expecting no output if event is null
Confusing event invocation syntax
4. The following code tries to unsubscribe a method from an event but causes a runtime error:
public class Publisher {
public event Action Notify;
}
var pub = new Publisher();
pub.Notify -= () => Console.WriteLine("Hello");
What is the main issue causing the error?
medium
A. Lambda expressions cannot be used with events
B. Events cannot be unsubscribed in C#
C. The event Notify is not initialized
D. Cannot unsubscribe a lambda expression that was never subscribed
Solution
Step 1: Understand event unsubscription rules
In C#, events start as null delegates. Unsubscribing (-=) from a null event throws NullReferenceException.
Step 2: Identify cause of runtime error
No prior subscription means Notify is null, so pub.Notify -= lambda throws NullReferenceException. The lambda was never subscribed.
Final Answer:
Cannot unsubscribe a lambda expression that was never subscribed -> Option D
Quick Check:
Null event -= throws NullRef [OK]
Hint: Unsubscribe only delegates you subscribed before [OK]
Common Mistakes:
Assuming unsubscribing any lambda works
Thinking events cannot be unsubscribed
Confusing null event invocation with unsubscription
5. You want to implement a publisher-subscriber system where multiple subscribers can register to receive messages, but some subscribers should only receive messages if a condition is true (e.g., message contains a keyword). Which approach best applies this conditional filtering in C#?
hard
A. Use event subscription with wrapper methods that check the condition before handling
B. Modify the publisher to send messages only to specific subscribers directly
C. Use multiple events for each condition and subscribe accordingly
D. Use a single event and let subscribers unsubscribe if condition is false
Solution
Step 1: Understand conditional filtering in subscriber model
The publisher sends events to all subscribers; filtering is best done in subscriber methods.
Step 2: Apply wrapper methods for condition
Subscribers can register methods that first check the condition and only proceed if true, keeping publisher simple.
Step 3: Evaluate other options
Modifying publisher to target subscribers breaks decoupling; multiple events add complexity; unsubscribing dynamically is inefficient.
Final Answer:
Use event subscription with wrapper methods that check the condition before handling -> Option A