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

Event unsubscription and memory in C Sharp (C#)

Choose your learning style10 modes available
Introduction

Unsubscribing from events helps stop unwanted actions and frees memory. It keeps your program clean and fast.

When you no longer want to receive updates from an event.
To prevent memory leaks in long-running applications.
When an object that subscribed to an event is about to be destroyed.
To avoid unexpected behavior from events firing after an object is gone.
Syntax
C Sharp (C#)
eventSource.EventName -= EventHandlerMethod;

Use the same method you used to subscribe, but with '-=' to unsubscribe.

Unsubscribing is important especially in applications with many events or long lifetimes.

Examples
This line removes the method OnSomeEvent from the SomeEvent event.
C Sharp (C#)
publisher.SomeEvent -= OnSomeEvent;
Stops the Button_Click method from running when the button is clicked.
C Sharp (C#)
button.Click -= Button_Click;
Sample Program

This program shows a publisher sending an event and a subscriber listening. After unsubscribing, the subscriber no longer reacts, which helps avoid memory leaks and unwanted calls.

C Sharp (C#)
using System;

class Publisher
{
    public event EventHandler? RaiseEvent;

    public void DoSomething()
    {
        Console.WriteLine("Doing something...");
        RaiseEvent?.Invoke(this, EventArgs.Empty);
    }
}

class Subscriber
{
    public void Subscribe(Publisher pub)
    {
        pub.RaiseEvent += HandleEvent;
    }

    public void Unsubscribe(Publisher pub)
    {
        pub.RaiseEvent -= HandleEvent;
    }

    private void HandleEvent(object? sender, EventArgs e)
    {
        Console.WriteLine("Event received in subscriber.");
    }
}

class Program
{
    static void Main()
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub);
        pub.DoSomething();  // Event fires, subscriber reacts

        sub.Unsubscribe(pub);
        pub.DoSomething();  // Event fires, but subscriber does not react
    }
}
OutputSuccess
Important Notes

Always unsubscribe from events when the subscriber is no longer needed.

Failing to unsubscribe can cause memory leaks because the publisher keeps a reference to the subscriber.

Use weak event patterns or tools if manual unsubscription is difficult.

Summary

Unsubscribing stops event notifications and frees memory.

Use '-=' with the same method to unsubscribe from an event.

Always unsubscribe to avoid memory leaks and unexpected behavior.

Practice

(1/5)
1. What happens if you do not unsubscribe from an event in C#?
easy
A. The event will automatically unsubscribe after the first call.
B. The program will throw a compile-time error.
C. The subscriber object may not be garbage collected, causing a memory leak.
D. The event handler will be called only once.

Solution

  1. Step 1: Understand event subscription behavior

    When an object subscribes to an event, the event publisher holds a reference to the subscriber's method.
  2. Step 2: Effect of not unsubscribing

    If you don't unsubscribe, the subscriber object remains referenced and cannot be garbage collected, causing a memory leak.
  3. Final Answer:

    The subscriber object may not be garbage collected, causing a memory leak. -> Option C
  4. Quick Check:

    Not unsubscribing = memory leak [OK]
Hint: Always unsubscribe to avoid memory leaks and keep memory clean [OK]
Common Mistakes:
  • Assuming events auto-unsubscribe
  • Thinking unsubscribing causes errors
  • Believing event handlers run only once
2. Which syntax correctly unsubscribes a method named OnDataReceived from an event DataReceived?
easy
A. DataReceived -= OnDataReceived;
B. DataReceived += OnDataReceived;
C. DataReceived = null;
D. DataReceived.Unsubscribe(OnDataReceived);

Solution

  1. Step 1: Recall event unsubscription syntax

    In C#, to unsubscribe from an event, use the '-=' operator with the same method.
  2. Step 2: Match correct syntax

    DataReceived -= OnDataReceived; uses 'DataReceived -= OnDataReceived;', which is the correct way to unsubscribe.
  3. Final Answer:

    DataReceived -= OnDataReceived; -> Option A
  4. Quick Check:

    Unsubscribe syntax = '-=' operator [OK]
Hint: Use '-=' with the same method to unsubscribe events [OK]
Common Mistakes:
  • Using '+=' instead of '-=' to unsubscribe
  • Trying to assign null to the event
  • Using non-existent Unsubscribe method
3. What will be the output of the following code?
using System;
class Program {
  static event Action MyEvent;
  static void Handler() => Console.WriteLine("Called");
  static void Main() {
    MyEvent += Handler;
    MyEvent -= Handler;
    MyEvent?.Invoke();
  }
}
medium
A. Called
B. No output
C. NullReferenceException
D. Compile-time error

Solution

  1. Step 1: Analyze event subscription and unsubscription

    The method Handler is subscribed then immediately unsubscribed from MyEvent.
  2. Step 2: Check event invocation

    Since no handlers remain, MyEvent is null, so MyEvent?.Invoke() does nothing and prints no output.
  3. Final Answer:

    No output -> Option B
  4. Quick Check:

    Unsubscribed event = no call [OK]
Hint: Unsubscribed event handlers do not run when invoked [OK]
Common Mistakes:
  • Expecting output despite unsubscription
  • Ignoring null conditional operator
  • Thinking event throws exception if empty
4. Identify the problem in this code snippet related to event unsubscription:
class Publisher {
  public event Action OnChange;
  public void Raise() => OnChange?.Invoke();
}
class Subscriber {
  public void Subscribe(Publisher p) {
    p.OnChange += HandleChange;
  }
  void HandleChange() {
    Console.WriteLine("Changed");
  }
}
medium
A. Subscriber never unsubscribes, causing potential memory leaks.
B. Event is invoked incorrectly with null conditional operator.
C. Handler method signature does not match event delegate.
D. Publisher event is not declared as static.

Solution

  1. Step 1: Review subscription and unsubscription

    The Subscriber subscribes to the event but never unsubscribes.
  2. Step 2: Understand consequences

    Without unsubscription, the Subscriber object remains referenced by Publisher, causing memory leaks.
  3. Final Answer:

    Subscriber never unsubscribes, causing potential memory leaks. -> Option A
  4. Quick Check:

    Missing unsubscribe = memory leak risk [OK]
Hint: Always unsubscribe to avoid memory leaks in event handlers [OK]
Common Mistakes:
  • Ignoring unsubscription importance
  • Confusing static and instance events
  • Assuming null conditional operator causes errors
5. You have a long-running application where multiple subscribers attach to a static event but never unsubscribe. What is the best approach to prevent memory leaks?
hard
A. Replace events with polling loops to avoid subscription issues.
B. Make the event instance-level instead of static to avoid leaks.
C. Ignore unsubscription because garbage collector handles it automatically.
D. Use weak event patterns or explicitly unsubscribe when subscribers are no longer needed.

Solution

  1. Step 1: Understand static event references

    Static events hold references for the app lifetime, so subscribers never get garbage collected unless unsubscribed.
  2. Step 2: Best practice to avoid leaks

    Using weak event patterns or explicitly unsubscribing prevents memory leaks by releasing subscriber references.
  3. Final Answer:

    Use weak event patterns or explicitly unsubscribe when subscribers are no longer needed. -> Option D
  4. Quick Check:

    Weak events or unsubscribe = prevent leaks [OK]
Hint: Use weak events or unsubscribe explicitly to avoid leaks [OK]
Common Mistakes:
  • Assuming GC cleans static event subscribers
  • Changing event to instance-level without reason
  • Replacing events with inefficient polling
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