What is the purpose of creating custom event arguments in C#?
Custom event arguments allow you to pass additional data with an event, beyond the standard EventArgs, so event handlers can receive specific information related to the event.
Click to reveal answer
beginner
How do you define a custom event argument class in C#?
You create a class that inherits from EventArgs and add properties to hold the extra data you want to pass with the event.
Click to reveal answer
intermediate
Why should custom event argument classes inherit from EventArgs?
Inheriting from EventArgs follows .NET conventions and allows your custom arguments to be used with standard event patterns and delegates like EventHandler<T>.
Click to reveal answer
beginner
What is the typical signature of an event handler using custom event arguments?
The event handler method usually has two parameters: an object sender and a custom event argument type derived from EventArgs, e.g., void Handler(object sender, MyEventArgs e).
Click to reveal answer
intermediate
How do you raise an event with custom event arguments in C#?
You create an instance of your custom event argument class with the needed data, then call the event delegate passing 'this' as sender and the custom args instance.
Click to reveal answer
What base class should a custom event argument class inherit from?
AObject
BEventArgs
CEventHandler
DDelegate
✗ Incorrect
Custom event argument classes should inherit from EventArgs to follow .NET event pattern conventions.
Which of the following is the correct event handler signature for a custom event argument MyEventArgs?
Avoid Handler(MyEventArgs e, object sender)
Bvoid Handler(object sender)
Cvoid Handler(object sender, MyEventArgs e)
Dvoid Handler()
✗ Incorrect
The standard signature is (object sender, MyEventArgs e) where sender is the event source and e holds event data.
Why create custom event arguments instead of using EventArgs directly?
ATo avoid using delegates
BTo make events slower
CTo prevent event subscription
DTo pass extra information with the event
✗ Incorrect
Custom event arguments let you send extra data to event handlers, which EventArgs alone cannot do.
How do you raise an event with custom arguments in C#?
ACall the event delegate with sender and new custom args instance
BCall the event delegate with only sender
CCall the event delegate with no parameters
DCall the event delegate with only custom args
✗ Incorrect
You pass both the sender (usually 'this') and an instance of your custom event args to the event delegate.
Which keyword is used to declare an event in C#?
Aevent
Bdelegate
Cclass
Dvoid
✗ Incorrect
The 'event' keyword declares an event in C#.
Explain how to create and use custom event arguments in C#.
Think about how to pass extra information with events.
You got /5 concepts.
Describe the benefits of using custom event arguments instead of the default EventArgs.
Consider what extra information event handlers might need.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of creating a custom class that inherits from EventArgs in C#?
easy
A. To replace the EventHandler delegate entirely.
B. To prevent events from being raised multiple times.
C. To send additional data with an event when it is raised.
D. To automatically handle exceptions in event handlers.
Solution
Step 1: Understand the role of EventArgs
The EventArgs class 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 C
Quick Check:
Custom EventArgs = Extra event data [OK]
Hint: Custom EventArgs carry extra info with events [OK]
2. Which of the following is the correct way to declare a custom event argument class named MyEventArgs with a string property Message?
easy
A. public class MyEventArgs : EventArgs { public int Message { get; set; } }
B. public class MyEventArgs { public string Message { get; set; } }
C. public class MyEventArgs : EventHandler { public string Message; }
D. public class MyEventArgs : EventArgs { public string Message { get; set; } }
Solution
Step 1: Check inheritance from EventArgs
The custom event argument class must inherit from EventArgs to be used properly in events.
Step 2: Verify property type and syntax
The property Message should be a string with get and set accessors for data storage.
Final Answer:
public class MyEventArgs : EventArgs { public string Message { get; set; } } -> Option D
Quick Check:
Custom EventArgs inherit EventArgs + correct property type [OK]
Hint: Custom EventArgs must inherit EventArgs and use correct property types [OK]
Common Mistakes:
Forgetting to inherit from EventArgs
Using EventHandler as base class instead of EventArgs
Declaring property with wrong type
3. Consider the following code snippet:
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?
medium
A. Number is 42
B. Number is 0
C. No output, event not raised
D. Compilation error due to event handler signature
Solution
Step 1: Understand event raising and subscription
The Publisher raises OnNumberChanged event with MyEventArgs containing the number passed.
Step 2: Check subscriber's event handler output
The subscriber prints the Number property from the event args, which is set to 42.
Final Answer:
Number is 42 -> Option A
Quick Check:
Event raised with Number=42 prints "Number is 42" [OK]
Hint: Event args data prints exactly as passed in event [OK]
Common Mistakes:
Assuming event is not raised or subscribed
Confusing default values with passed values
Mistaking event handler signature causing errors
4. The following code attempts to raise a custom event with arguments but causes a runtime error. What is the most likely cause?
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();
medium
A. OnInfoChanged event is null because no subscribers are attached.
B. MyEventArgs does not inherit from EventArgs.
C. Event handler signature does not match the event declaration.
D. The Info property is not initialized before raising the event.
Solution
Step 1: Check event invocation safety
The event OnInfoChanged is 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 if OnInfoChanged is not null to avoid errors.
Final Answer:
OnInfoChanged event is null because no subscribers are attached. -> Option A
Quick Check:
Invoke event without subscribers = NullReferenceException [OK]
Hint: Always check event is not null before invoking [OK]
Common Mistakes:
Forgetting to check event for null before invoking
Assuming event has subscribers by default
Confusing property initialization with event subscription
5. You want to create a custom event argument class 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?
hard
A. public class ProgressEventArgs {
public int Percentage { get; set; }
public string Message { get; set; }
}
public class Downloader {
public event EventHandler ProgressChanged;
public void ReportProgress(int percent, string msg) {
ProgressChanged?.Invoke(this, new ProgressEventArgs { Percentage = percent, Message = msg });
}
}
B. 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));
}
}
C. public class ProgressEventArgs : EventArgs {
public int Percentage;
public string Message;
}
public class Downloader {
public event EventHandler<ProgressEventArgs> ProgressChanged;
public void ReportProgress(int percent, string msg) {
ProgressChanged(this, new ProgressEventArgs { Percentage = percent, Message = msg });
}
}
D. public class ProgressEventArgs : EventArgs {
public int Percentage { get; set; }
public string Message { get; set; }
}
public class Downloader {
public event EventHandler<ProgressEventArgs> ProgressChanged;
public void ReportProgress(int percent, string msg) {
ProgressChanged(this, new ProgressEventArgs { Percentage = percent, Message = msg });
}
}
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));
}
} defines ProgressEventArgs inheriting from EventArgs with 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 B
Quick Check:
Immutable EventArgs via ctor + safe ?.Invoke [OK]
Hint: Use constructor for EventArgs properties and null-check event before invoke [OK]
Common Mistakes:
Not inheriting from EventArgs
Using wrong event handler delegate type
Invoking event without null check
Using public fields instead of properties
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.