Custom event arguments let you send extra information when an event happens. This helps the event handler know more about what caused the event.
Custom event arguments in C Sharp (C#)
public class MyEventArgs : EventArgs { public string Message { get; } public MyEventArgs(string message) { Message = message; } }
Custom event argument classes usually inherit from EventArgs.
Make properties read-only to keep data safe after creation.
public class TemperatureChangedEventArgs : EventArgs { public double NewTemperature { get; } public TemperatureChangedEventArgs(double newTemp) { NewTemperature = newTemp; } }
public class FileDownloadedEventArgs : EventArgs { public string FileName { get; } public int FileSize { get; } public FileDownloadedEventArgs(string fileName, int fileSize) { FileName = fileName; FileSize = fileSize; } }
This program creates a custom event argument MessageEventArgs to send a message string when the MessageReceived event fires. The Messenger class raises the event with the message. The main program listens and prints the messages.
using System; public class MessageEventArgs : EventArgs { public string Message { get; } public MessageEventArgs(string message) { Message = message; } } public class Messenger { public event EventHandler<MessageEventArgs> MessageReceived; public void ReceiveMessage(string message) { // Raise the event with custom arguments MessageReceived?.Invoke(this, new MessageEventArgs(message)); } } class Program { static void Main() { Messenger messenger = new Messenger(); messenger.MessageReceived += (sender, e) => { Console.WriteLine($"New message: {e.Message}"); }; messenger.ReceiveMessage("Hello, friend!"); messenger.ReceiveMessage("How are you?"); } }
Always check if the event is not null before invoking it to avoid errors.
Custom event arguments help keep your events clear and meaningful.
Custom event arguments let you send extra data with events.
Create a class inheriting from EventArgs to hold your data.
Use these arguments when raising and handling events for clearer communication.
Practice
EventArgs in C#?Solution
Step 1: Understand the role of
TheEventArgsEventArgsclass is used to pass data with events. Creating a custom class inheriting from it allows adding extra information.Step 2: Identify the purpose of custom event arguments
Custom event argument classes let you send specific data related to the event, making event communication clearer.Final Answer:
To send additional data with an event when it is raised. -> Option CQuick Check:
Custom EventArgs = Extra event data [OK]
- Thinking custom EventArgs replace EventHandler delegate
- Believing custom EventArgs stop event repetition
- Assuming custom EventArgs handle exceptions automatically
MyEventArgs with a string property Message?Solution
Step 1: Check inheritance from
The custom event argument class must inherit fromEventArgsEventArgsto be used properly in events.Step 2: Verify property type and syntax
The propertyMessageshould be a string with get and set accessors for data storage.Final Answer:
public class MyEventArgs : EventArgs { public string Message { get; set; } } -> Option DQuick Check:
Custom EventArgs inherit EventArgs + correct property type [OK]
- Forgetting to inherit from EventArgs
- Using EventHandler as base class instead of EventArgs
- Declaring property with wrong type
public class MyEventArgs : EventArgs { public int Number { get; set; } }
public class Publisher {
public event EventHandler<MyEventArgs> OnNumberChanged;
public void ChangeNumber(int num) {
OnNumberChanged?.Invoke(this, new MyEventArgs { Number = num });
}
}
public class Subscriber {
public void Subscribe(Publisher pub) {
pub.OnNumberChanged += HandleNumberChanged;
}
private void HandleNumberChanged(object sender, MyEventArgs e) {
Console.WriteLine($"Number is {e.Number}");
}
}
// Main method
var pub = new Publisher();
var sub = new Subscriber();
sub.Subscribe(pub);
pub.ChangeNumber(42);What will be the output when this code runs?
Solution
Step 1: Understand event raising and subscription
ThePublisherraisesOnNumberChangedevent withMyEventArgscontaining the number passed.Step 2: Check subscriber's event handler output
The subscriber prints theNumberproperty from the event args, which is set to 42.Final Answer:
Number is 42 -> Option AQuick Check:
Event raised with Number=42 prints "Number is 42" [OK]
- Assuming event is not raised or subscribed
- Confusing default values with passed values
- Mistaking event handler signature causing errors
public class MyEventArgs : EventArgs { public string Info { get; set; } }
public class Publisher {
public event EventHandler<MyEventArgs> OnInfoChanged;
public void RaiseEvent() {
OnInfoChanged(this, new MyEventArgs { Info = "Hello" });
}
}
// Usage
var pub = new Publisher();
pub.RaiseEvent();Solution
Step 1: Check event invocation safety
The eventOnInfoChangedis invoked without checking if it has subscribers, so if null, it causes a runtime NullReferenceException.Step 2: Identify missing subscriber check
Before invoking, the code should check ifOnInfoChangedis not null to avoid errors.Final Answer:
OnInfoChanged event is null because no subscribers are attached. -> Option AQuick Check:
Invoke event without subscribers = NullReferenceException [OK]
- Forgetting to check event for null before invoking
- Assuming event has subscribers by default
- Confusing property initialization with event subscription
ProgressEventArgs that includes a percentage (int) and a message (string). You also want to raise an event ProgressChanged in a class Downloader that sends this data. Which of the following code snippets correctly implements this scenario?Solution
Step 1: Define immutable custom event args with constructor
public class ProgressEventArgs : EventArgs { public int Percentage { get; } public string Message { get; } public ProgressEventArgs(int percentage, string message) { Percentage = percentage; Message = message; } } public class Downloader { public event EventHandler<ProgressEventArgs> ProgressChanged; public void ReportProgress(int percent, string msg) { ProgressChanged?.Invoke(this, new ProgressEventArgs(percent, msg)); } } definesProgressEventArgsinheriting fromEventArgswith readonly properties set via constructor, which is a good practice.Step 2: Raise event safely with null check
public class Downloader { public event EventHandler<ProgressEventArgs> ProgressChanged; public void ReportProgress(int percent, string msg) { ProgressChanged?.Invoke(this, new ProgressEventArgs(percent, msg)); } } uses null-conditional operator?.to safely raise the event with the new event args instance.Final Answer:
public class ProgressEventArgs : EventArgs { public int Percentage { get; } public string Message { get; } public ProgressEventArgs(int percentage, string message) { Percentage = percentage; Message = message; } } public class Downloader { public event EventHandler<ProgressEventArgs> ProgressChanged; public void ReportProgress(int percent, string msg) { ProgressChanged?.Invoke(this, new ProgressEventArgs(percent, msg)); } } -> Option BQuick Check:
Immutable EventArgs via ctor + safe ?.Invoke [OK]
- Not inheriting from EventArgs
- Using wrong event handler delegate type
- Invoking event without null check
- Using public fields instead of properties
Ready to prove it?
Pass the test and this pattern moves unknown
