Bird
Raised Fist0
C Sharp (C#)programming~5 mins

EventHandler delegate pattern in C Sharp (C#)

Choose your learning style10 modes available
Introduction
The EventHandler delegate pattern helps programs respond to actions like button clicks or messages by running specific code when those actions happen.
When you want your program to do something after a user clicks a button.
When you need to notify parts of your program that something important happened.
When you want to keep your code organized by separating the action from the response.
When building interactive applications like games or forms.
When you want multiple parts of your program to react to the same event.
Syntax
C Sharp (C#)
public delegate void EventHandler(object sender, EventArgs e);

// Usage example:
public event EventHandler MyEvent;

// To raise the event:
MyEvent?.Invoke(this, EventArgs.Empty);
The EventHandler delegate always has two parameters: the sender (who raised the event) and EventArgs (extra info about the event).
You can create your own EventArgs class if you want to send more details with the event.
Examples
This example shows a simple event named Clicked using the EventHandler delegate.
C Sharp (C#)
public event EventHandler Clicked;

// Raising the event
Clicked?.Invoke(this, EventArgs.Empty);
Here we use a custom EventArgs class to send a message with the event.
C Sharp (C#)
public class MyEventArgs : EventArgs {
    public string Message { get; set; }
}

public event EventHandler<MyEventArgs> MessageReceived;

// Raising the event with custom data
MessageReceived?.Invoke(this, new MyEventArgs { Message = "Hello" });
Sample Program
This program shows how to declare an event with EventHandler, subscribe to it, and raise it. When DoSomething runs, it triggers the event and the subscribed code runs.
C Sharp (C#)
using System;

class Program {
    // Declare an event using EventHandler
    public event EventHandler SomethingHappened;

    public void DoSomething() {
        Console.WriteLine("Doing something important...");
        // Raise the event
        SomethingHappened?.Invoke(this, EventArgs.Empty);
    }

    static void Main() {
        Program p = new Program();

        // Subscribe to the event with a method
        p.SomethingHappened += (sender, e) => {
            Console.WriteLine("Event received! Responding now.");
        };

        p.DoSomething();
    }
}
OutputSuccess
Important Notes
Always check if the event is not null before raising it using the ?. operator to avoid errors.
EventHandler is a built-in delegate type in C# designed for events with no extra data.
Use custom EventArgs classes when you want to send more information with your event.
Summary
EventHandler delegate pattern helps your program react to actions or changes.
Events use EventHandler to connect the action with the response code.
You can send extra info with events by creating custom EventArgs classes.

Practice

(1/5)
1. What is the main purpose of the EventHandler delegate in C#?
easy
A. To format strings for output
B. To create a new thread for event processing
C. To store data in a dictionary
D. To define a method signature for handling events

Solution

  1. Step 1: Understand what a delegate does

    A delegate defines a method signature that can be used to call methods indirectly.
  2. Step 2: Connect delegate to event handling

    The EventHandler delegate specifically defines the signature for methods that handle events.
  3. Final Answer:

    To define a method signature for handling events -> Option D
  4. Quick Check:

    EventHandler defines event method signature = D [OK]
Hint: EventHandler defines how event methods look [OK]
Common Mistakes:
  • Confusing EventHandler with threading
  • Thinking EventHandler stores data
  • Mixing EventHandler with string formatting
2. Which of the following is the correct syntax to declare an event using the EventHandler delegate in a class?
easy
A. public event EventHandler MyEvent;
B. public EventHandler event MyEvent;
C. event public EventHandler MyEvent();
D. public void event EventHandler MyEvent;

Solution

  1. Step 1: Recall event declaration syntax

    Events are declared with the keyword event followed by the delegate type and event name.
  2. Step 2: Match correct syntax

    public event EventHandler MyEvent; matches the correct pattern.
  3. Final Answer:

    public event EventHandler MyEvent; -> Option A
  4. Quick Check:

    Event declaration = event + delegate + name [OK]
Hint: Remember: event keyword before delegate type [OK]
Common Mistakes:
  • Placing 'event' after delegate type
  • Adding parentheses after event name
  • Using void instead of event keyword
3. What will be the output of the following code?
using System;
class Program {
    public static event EventHandler OnAction;
    static void Main() {
        OnAction += (sender, e) => Console.WriteLine("Action happened!");
        OnAction?.Invoke(null, EventArgs.Empty);
    }
}
medium
A. Action happened!
B. No output
C. NullReferenceException
D. Compilation error

Solution

  1. Step 1: Understand event subscription

    The lambda expression subscribes a method that prints "Action happened!" to the event OnAction.
  2. Step 2: Invoke the event safely

    The event is invoked with ?.Invoke, so it calls the subscribed method, printing the message.
  3. Final Answer:

    Action happened! -> Option A
  4. Quick Check:

    Subscribed event invoked prints message = A [OK]
Hint: ?.Invoke calls event only if not null [OK]
Common Mistakes:
  • Forgetting to subscribe to the event
  • Not using null-conditional operator causing errors
  • Expecting no output without invocation
4. Identify the error in this event usage code:
public class Button {
    public event EventHandler Click;
    public void SimulateClick() {
        Click(null, EventArgs.Empty);
    }
}
medium
A. EventHandler delegate cannot use EventArgs.Empty
B. Event must be invoked with a sender object, not null
C. Event should be checked for null before invoking
D. SimulateClick method must be static

Solution

  1. Step 1: Check event invocation safety

    Events can be null if no subscribers exist, so invoking without null check causes runtime error.
  2. Step 2: Correct usage

    Use Click?.Invoke(this, EventArgs.Empty); to safely invoke the event.
  3. Final Answer:

    Event should be checked for null before invoking -> Option C
  4. Quick Check:

    Always check event for null before invoke [OK]
Hint: Use ?.Invoke to avoid null errors [OK]
Common Mistakes:
  • Invoking event directly without null check
  • Assuming sender cannot be null
  • Making event handler static unnecessarily
5. You want to create a custom event that sends a string message to subscribers. Which is the best way to define the event and its arguments using the EventHandler pattern?
hard
A. Declare event as EventHandler and send string directly as sender parameter
B. Create a class inheriting from EventArgs with a string property, then declare event as EventHandler<YourArgs>
C. Use Action<string> delegate instead of EventHandler for the event
D. Declare event as EventHandler and ignore sending any data

Solution

  1. Step 1: Understand custom event data

    To send extra info, create a class derived from EventArgs with needed properties.
  2. Step 2: Use generic EventHandler with custom args

    Declare event as EventHandler<YourArgs> to pass the custom data safely.
  3. Final Answer:

    Create a class inheriting from EventArgs with a string property, then declare event as EventHandler<YourArgs> -> Option B
  4. Quick Check:

    Custom EventArgs + EventHandler<T> = B [OK]
Hint: Use EventHandler<T> with custom EventArgs for extra data [OK]
Common Mistakes:
  • Passing data via sender parameter
  • Using Action delegate instead of EventHandler
  • Ignoring event data when needed
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard